CLion + std :: ios_base :: sync_with_stdio (false) make std :: getline читает только первые 509 символов - PullRequest
0 голосов
/ 26 апреля 2020

Пожалуйста, прости меня за мой наивный английский sh и невежество, поскольку я новичок в программировании и C ++.

Пытаюсь сделать все возможное, чтобы предоставить основную c информацию:

  • Я использую CLion (студенческую версию) для кодирования на C ++.
  • . В моем Windows 10 блокноте он, кажется, называется CLion 2019.3.5 x64.
  • . Он недавно обновлен до версии 2020.1.
  • Установлен MinGW (я верю в последнее, но я не уверен, извините).

Мой вопрос:

Ну ... Как и в заголовке, я попытался использовать std::getline() для чтения текста. Не std::cin.getline(), а std::getline() (извините, я не совсем понимаю разницу, но я обнаружил, что это разные функции, требующие разных параметров). Я использую std::getline(), потому что (очевидно) я хочу прочитать строку с пробелами между ними. Тем не менее, кажется, что читает только первые 509 символов в моем входе ... Но ПОЧЕМУ ??????? Может показаться более вероятным, если он сначала прочитает 512 = 2 ^ 9 или что-то в этом роде.

Пример:

Это только один из протестированных мной кодов.

#include <iostream>

int main() {
    std::ios_base::sync_with_stdio(false); //THIS IS SOMETHING REMARKABLE in the context of my problem, which I would explain below
    std::string testing;
    std::getline(std::cin, testing); //There is no '\n' at the beginning so it would work well.
    std::cout << "testing.max_size() = " << testing.max_size() << '\n' //Just testing, should be 2147483647 or something, which therefore it's not the problem with how many characters a string can store.
              << "testing.length() = " << testing.length() << '\n'
              << R"(testing = ")" << testing << '"' << std::endl;
    return 0;
}

Ввод:

(Некоторая длинная строка длиной 689, фактически для моих собственных целей)

60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 60 29 61 31 62 33 63 35 64 37 65 39 66 41 67 43 68 45 69 47 70 49 71 51 72 53 73 55 74 19 75 29 76 7 77 31 78 15 79 33 80 7 81 35 82 11 83 37 84 19 85 39 86 15 87 41 88 11 89 43 90 27 91 45 92 25 93 47 94 23 95 49 96 21 97 51 98 3 99 53 100 3 101 55 102 17 103 13 104 27 105 25 106 23 107 21 108 9 109 5 110 13 111 17 112 5 113 9 114 0 115 0 116 0 117 0 118 0 119 0 120 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Вывод:

testing.max_size() = 2147483647
testing.length() = 509
testing = "60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 9
6 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 60 29 61 31 62 33 63 35 6
4 37 65 39 66 41 67 43 68 45 69 47 70 49 71 51 72 53 73 55 74 19 75 29 76 7 77 31 78 15 79 33 80 7 81 35 82 11 83 37 84
19 85 39 86 15 87 41 88 11 89 43 90 27 91 45 92 25 93 47 94 23 95 49 96 21 97 51 98 3 99 53 100 3 101 55 102 17 103 13 1
04 27 105 25 106 23 107 21 108 9 109 5 1"

(В консоли CLion, часто некоторые строки разбиты на две , что я не знаю почему, но это не имеет значения в контексте моего вопроса)

Объяснение:

Как видите, testing.length() == 509, и я тестировал в C ++ 14, а также в C ++ 20, этот проект (из CLion), а также другие проекты, открытые и, конечно, с другими текстами (на позиции 509 нет специальных символов, что я попытался заменить его другими символами, но все равно получил тот же результат).

И, кстати, у меня есть привычка использовать std::ios_base::sync_with_stdio(false) для увеличения скорости ввода и вывода, что, я думаю, приятно для меня (знаком с этой строкой кода в начале моей программы).

Однако , (может спасти ваш время тестирования), проблема с std::ios_base::sync_with_stdio(false). Когда я удаляю эту строку, программа работает очень хорошо, даже для строк, длина которых в несколько раз больше.

Однако , я не люблю опускать эту строку, так как я думаю, что это делает увеличьте скорость ввода-вывода и вообще не нужно ее удалять.

Также , это очень специфично c до CLion ( насколько я знаю о C ++ и программировании ). Я протестировал (с std::ios_base::sync_with_stdio(false)) в некотором онлайн-компиляторе C ++, и он отлично работает (testing.length() == 689 для моего ввода):

  1. https://www.onlinegdb.com/online_c++_compiler
  2. https://www.jdoodle.com/online-compiler-c++/

Обобщение моей проблемы:

Почему, исключительно в CLion (но не в некоторых онлайн-компиляторах), код std::ios_base::sync_with_stdio(false) делает исключительно std::getline() чтение максимум точно 509 символов (я тестировал на нескольких проектах)?

Это не кажется разумным для я ...

Подробнее:

Я пытался найти похожие проблемы, но извините, я не могу найти (очень) соответствующие сообщения.

Я хотел бы получить, по возможности, несколько подробных, но исчерпывающих ответов, поскольку я не являюсь экспертом в C ++ (хотя я хочу больше узнать о C ++).

Я надеюсь, что смогу решить эта проблема без остановки с помощью CLion / остановка с использованием std::ios_base::sync_with_stdio(false) ( соревновательное программирование! ) / остановка с использованием std::getline(), thx.

  • Да, я знаю, что увеличение производительности обычно маленький, см. ответ на этот пост , но большую часть времени std::ios_base::sync_with_stdio(false) важен для меня, поэтому есть какое-то исправление или что-то, что не требует std::ios_base::sync_with_stdio(true)? Даже если нет, я бы удивился, почему ...

Буду признателен за любую помощь, спасибо!

...