C ++: ifstream :: getline проблема - PullRequest
2 голосов
/ 16 января 2011

Я читаю файл, подобный этому:

char string[256];

std::ifstream file( "file.txt" ); // open the level file.

if ( ! file ) // check if the file loaded fine.
{
    // error
}

while ( file.getline( string, 256, ' ' )  )
{
    // handle input
}

Просто для тестирования мой файл - всего одна строка с пробелом в конце:

12345 

Мой код сначала успешно читает 12345. Но затем вместо окончания цикла он читает другую строку, которая выглядит как return / newline.

Я сохранил свой файл как в gedit, так и в nano. И я также вывел его командой Linux cat, и в конце возврата нет. Так что файл должен быть в порядке.

Почему мой код читает возврат / перевод строки?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 16 января 2011

Первые буквы убедитесь, что ваш входной файл в порядке:

Запустите следующую команду и сообщите нам результат:

#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <fstream>>
#include <iomanip>
#include <algorithm>

int main()
{
    std::ifstream file("file.txt");
    std::cout << std::hex;

    std::copy(std::istreambuf_iterator<char>(file),
              std::istreambuf_iterator<char>(),

              std::ostream_iterator<int>(std::cout, " ")); 
}

Edit:

Выход был 31 32 33 34 35 20 0A

Попробуйте запустить этот код и посмотрите, что получится:

#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <fstream>>
#include <iomanip>
#include <algorithm>

int main()
{
    std::ofstream file("file.txt");
    file << "12345 \n";
}

Создать вывод этого файла и сравнить его с оригиналом.
Проблема в том, что разные платформы имеют разные последовательности завершения строки. Я просто хочу убедиться, что «0x0A» - это последовательность завершения строки для вашей платформы. Обратите внимание, что последовательность завершения строки преобразуется в '\ n', когда файл читается в текстовом режиме, а когда вы выводите '\ n' в файл в текстовом режиме, он преобразуется в последовательность завершения строки.

Редактировать 2

Итак, у меня есть файл: file.txt

> od -ta -tx1 file.txt
0000000    1   2   3   4   5  sp  nl                                    
           31  32  33  34  35  20  0a                                    
0000007

Таким образом, файл содержит 1 строку, оканчивающуюся на 0x0A

Использование этой программы:

#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <fstream>>
#include <iomanip>
#include <algorithm>

int main()
{
    std::ifstream   file("file.txt");

    std::string line;
    while(std::getline(file,line))
    {
        std::cout << "Line(" << line << ")\n";
    }
}

Я получаю:

> g++ t.cpp
> ./a.out
Line(12345 )
2 голосов
/ 16 января 2011

это работает ...

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

using namespace std;

ifstream file("file.txt");

int main()
{
   string tmp="",st="";

   while (!file.eof())
    {
      file>>tmp;  
      if (tmp != "") st+=tmp;
      tmp="";  
    }
   cout<<st<<endl; 

   return 0;
}

входной файл.txt: 1 2 3 4 5
ответ: 12345

0 голосов
/ 16 января 2011

Попробуйте так:

while ( !file.eof()  )
{
    file.getline( string, 256, ' ' );
        // handle input
}
...