Чтение файлов с новой строкой и без нее - PullRequest
0 голосов
/ 27 февраля 2020

С точки зрения чтения входного файла,

  • Я обнаружил

    for (i = 0; !inStream.eof() ; i++) inStream >> input[i];
    

    пытается прочитать еще раз, если на "новой строке" конец файла.

    for (i=0; inStream >> input[i]; i++ ) ; 
    

    , кажется, работает независимо от того, есть ли новая строка или нет в конце файла.

    Существуют ли другие удобные решения для обработки "новой строки" в конец файла?

  • в c, я пишу

    FILE *fp = fopen("file", "r") ;
    for (i=0; fscanf(fp, "%d", & input[i]) > 0 ; i++ ) ;
    

Есть ли способ использовать fscanf с входной файл c ++ не использует fopen()?

Ответы [ 2 ]

3 голосов
/ 27 февраля 2020

Библиотека C ++ предоставляет вам удобную функцию getline. Вот минимальный пример из cplusplus.com

// reading a text file
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () {
  string line;
  ifstream myfile ("example.txt");
  if (myfile.is_open())
  {
    while ( getline (myfile,line) )
    {
      cout << line << '\n';
    }
    myfile.close();
  }

  else cout << "Unable to open file"; 

  return 0;
}
0 голосов
/ 27 февраля 2020

как я могу использовать fscanf с потоком входного файла c ++?

Возможно. И g++, и Visual Studio имеют собственные расширения, делающие это возможным. Если вы найдете такие возможности, они нестандартны и не переносимы. Я советую вам найти другие способы.

Если вы используете C ++, попробуйте использовать большинство из них. C имеет fscanf, который выглядит опрятно - но это зверь. C ++ имеет std::scanf для переносимости - и это тот же тип зверя. Не используйте его, если вы программируете на C ++.

Проблема, которую вы пытаетесь избежать

for (i = 0; !inStream.eof() ; i++) inStream >> input[i];
пытается прочитать еще раз, если есть «Новая строка» в конце файла.

вызвано неправильным использованием eof(). eof() возвращает true после того, как вы попытались прочитать за конец файла. Лучше l oop будет выглядеть так:

for (i = 0; inStream >> input[i] ; i++);

Обратите внимание, как извлечение и условия стали одним? Это не так. Извлечение происходит первым и возвращает поток , использованный при извлечении. Поток имеет bool перегрузку, которая сообщает вам, находится ли он в состоянии сбоя или нет, что отлично подходит для такой проверки: if(stream >> variable) { /* success */ } else { /* fail */ }.

Это работает, только если в вашем массиве достаточно записей для хранения все входные хотя. Ваш l oop не проверяет это. Если вы используете vector, вы можете просто читать элементы и push_back, чтобы заставить его работать долгое время. Если у вас фиксированный (относительно небольшой) размер и вы выполняете вышеперечисленные действия, он в конечном итоге не сможет.

...