getline () читает дополнительную строку - PullRequest
0 голосов
/ 29 сентября 2011
ifstream file("file.txt");
 if(file.fail())
{
cout<<"Could not open the file";
exit(1);
}
else
{
      while(file)
      {
        file.getline(line[l],80); 
                          cout<<line[l++]<<"\n";
      } 
}

Я использую двумерный массив символов, чтобы текст (более одной строки) читался из файла, чтобы подсчитать количество строк и слов в файле, но проблема в том, что getline всегда читает лишнюю строку.

Ответы [ 5 ]

3 голосов
/ 29 сентября 2011

Ваш код, как я пишу это:

ifstream file("file.txt");
 if(file.fail())
{
cout<<"Could not open the file";
exit(1);
}
else
{
      while(file)
      {
        file.getline(line[l],80); 
        cout<<line[l++]<<"\n";
      } 
}

При первом сбое getline вы все равно увеличиваете счетчик строк и выводите (несуществующую) строку.

Всегда проверяйте на наличие ошибки.

дополнительный совет: используйте std::string из заголовка <string> и используйте его функцию getline.

cheers & hth.

1 голос
/ 29 сентября 2011

Проблема в том, что когда вы находитесь в конце файла, тест на file все равно будет успешным, потому что вы еще не прочитали после конца файла.Таким образом, вам также нужно проверить возвращение из getline().

Поскольку вам нужно проверить возвращение из getline(), чтобы увидеть, успешно ли оно выполнено, вы также можете поместить его прямо в цикл while:

while (file.getline(line[l], 80))
    cout << line[l++] << "\n";

Таким образом, вам не требуется отдельный тест для file и getline().

1 голос
/ 29 сентября 2011

Делайте cout только если file.good() верно.Дополнительная строка, которую вы видите, происходит от последнего вызова file.getline(), который читает за концом файла.

0 голосов
/ 04 апреля 2013

Это решит вашу проблему:

ifstream file("file.txt");
if(!file.good())
{
  cout<<"Could not open the file";
  exit(1);
}
else
{
  while(file)
  {
    file.getline(line[l],80);
       if(!file.eof())
          cout<<line[l++]<<"\n";
  } 
}

Более надежный

0 голосов
/ 29 сентября 2011

Завершает ли файл символ новой строки?Если это так, флаг EOF не будет срабатывать, пока не пройдет один дополнительный цикл.Например, если файл

abc\n
def\n

Тогда цикл будет запущен 3 раза, в первый раз он получит abc, во второй раз он получит def и в третий разничего не получитьВозможно, поэтому вы видите дополнительную строку.

Попробуйте проверить бит ошибки в потоке ПОСЛЕ getline.

...