Новая строка изменяет способ чтения строк из файла в C ++ - PullRequest
1 голос
/ 21 мая 2019

После того, как текстовый файл прочитан из ifstream для сохранения каждой строки в векторе строк, он должен быть распечатан с использованием цикла for, но он показывает только последнюю строку, когда в конце cout нет новой строки.

Я попробовал два сценария, чтобы распечатать вектор строк: 1) cout << s; 2) cout << s << '\n';

где s - строка вектора, которая повторяет каждый цикл. 1) показывает только последнюю строку, тогда как 2) показывает весь текст.

ifstream inFile("sample.txt");
string str;
vector<string> strings;

while (getline(inFile, str))
    strings.push_back(str);

for (auto s : strings)
    std::cout << s;

Пример текста:

Test File
The quick brown fox jumps over the lazy dog.

cout << s; только напечатано:

The quick brown fox jumps over the lazy dog.

cout << s << '\n'; напечатано:

Test File
The quick brown fox jumps over the lazy dog.

Я ожидал второго результата при выполнении первого случая. Как новая строка меняет результат вывода, кроме самой новой строки?

EDITED : Так как getline() останавливается при достижении новой строки и также не читает новой строки, cout без \n должен был печатать Test FileThe quick brown fox jumps over the lazy dog , если программа был выполнен на Windows . Потому что ifstream работает в режиме text , который преобразует \r\n в \n.

Однако, поскольку я использую g ++, установленный на Cygwin, это вряд ли произойдет. Вот почему Test File\r\nThe quick brown fox jumps over the lazy dog показывает только The quick brown fox jumps over the lazy dog.

Проще говоря, \r возвращает выходную строку к исходной точке, и текст обрезается до \r.

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

В Windows текстовые файлы обычно хранятся со строками, разделенными переводом каретки (CR) и переводом строки (LF).Если файл открывается в двоичном режиме, вы получите оба этих символа при чтении в тексте.

То есть getline, который разделяется на '\n' (что почти наверняка совпадает со значениемLF), дает вам строки, оканчивающиеся на CR ('\r').

Когда вы печатаете CR, консоль может вернуть курсор в начало текущей строки.Затем вы печатаете следующую строку, и то, что вы изначально напечатали, перезаписывается.Поскольку, в вашем случае, первая строка была короче второй, она выглядела как пропущенная в первой строке.

Проблема с этим объяснением состоит в том, что открывается

ifstream inFile("sample.txt");

файл в текстовом режиме, а не в двоичном режиме.Таким образом, CR + LF должен быть уменьшен до '\n', и он должен работать.

Вот некоторые возможные объяснения:

  1. Код, который вы 'Показано, что это не совсем то же самое, что код, который вы используете, и что inFile фактически открывается в двоичном режиме.

  2. Файл sample.txt уже искажен и имеет строкичто заканчивается в CR + CR + LF.

0 голосов
/ 10 июня 2019

Попробуйте с cout << s << endl;

Возможно, вы используете библиотеку, IDE или отладчик, которые устанавливают iostream для очистки только на новой строке.

Вы можете попробовать также с cout << s << flush, и заметьте, что endl походит на \n символ плюс флеш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...