getline и печать с cout - PullRequest
       1

getline и печать с cout

1 голос
/ 28 января 2012

Я пытаюсь прочитать текстовый файл по одной строке за раз и распечатать каждую строку в окне терминала.Я компилирую на Mac, используя g ++, например, g ++ cpp3.cpp -o cpp3.

Текстовый файл выглядит так:

20100000001 20100000001.xml
20100000002 20100000002.xml
20100000003 20100000003.xml
20100000004 20100000004.xml

Вот мой код:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream ifs("file.txt");
    string line;
    while(getline(ifs,line)) {
        getline(ifs,line);
        cout << "[ " << line << " ]" << endl;
    }
return 0;
}

Я бы хотел, чтобы вывод выглядел следующим образом:

[20100000001    20100000001.xml]
[20100000002    20100000002.xml]
[20100000003    20100000003.xml]
[20100000004    20100000004.xml]

Однако все выводится на терминал в одной строке.Другими словами, каждая строка из текстового файла написана поверх последней.Кроме того, квадратные скобки «[» и «]», по-видимому, записываются только один раз, поэтому в основном выводится «[», затем все содержимое файла, а затем «]».

Так что этокак выглядит окончательный вывод на терминал:

user$ ./cpp3
 ]10000000401   20100000004.xml

user$

Может кто-нибудь объяснить, почему это происходит и / или как решить проблему?

Ответы [ 2 ]

3 голосов
/ 28 января 2012

Взгляните на файл данных - возможно, с od -c.

Все, что написано в верхней части каждой строки, звучит так, как будто вы печатаете \r (возврат каретки), а не \n (перевод строки) в выводе, возможно, потому что данные не содержат символов новой строки. Может быть, файл поступил из среды Windows, и getline() удаляет символ новой строки, оставляя возврат каретки в конце, а вывод не восстанавливает символ новой строки?

Или, возможно, файл содержит только \r окончания строки - в этом случае getline() будет читать весь файл как одну строку и выводить его как одну строку. Вы можете продемонстрировать это, добавив счетчик к выходу, увеличивая его для каждой строки вывода. Ваше наблюдение о «квадратных скобках, напечатанных один раз» предполагает, что это может быть лучше, чем пораженное предложение. У вас есть endl на выходе, что важно.

0 голосов
/ 28 января 2012

Вам нужно удалить getline(ifs, line); вот так:

while(getline(ifs,line)) {
    cout << "[" << line << "]" << endl;
}

Кроме того, вам нужно убрать пробелы между квадратными скобками, иначе вывод будет выглядеть так:

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