C ++ Чтение данных fstream из файла не возвращает правильных значений.inputFile.tellg возвращает -1 - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь прочитать данные из входного файла, который содержит целое число в первой строке (представляет количество изображений, перечисленных в файле), число с плавающей запятой во второй строке (это используется для других вычислений в основной программе) и значения с плавающей запятой в каждой последующей строке, заканчивающиеся именем файла изображения, в одном файле data.txt.Последняя строка файла data.txt содержит краткое описание того, для чего используются данные, но они не читаются программой.Когда я пытаюсь прочитать данные и распечатать их на экране, значения неверны.Первая строка файла data.txt - это 5, но когда я его распечатываю, я получаю 0, к которому я его инициализировал.Вторая строка - это значение с плавающей запятой, которое я считаю, и оно также выводится как 0, что также является инициализацией.Остальные данные считываются циклом while, при котором выводятся только части данных, но ничего не печатается.Я вставил cout << inputFile.tellg << endl;оператор, чтобы увидеть, куда указывает указатель файла, но он возвращает -1.Я полностью застрял на этом.Любое понимание будет высоко ценится.Спасибо за ваше время и знания. </p>

Пожалуйста, приложите образец копии файла data.txt, а также файла main.cpp.

data.txt

5
5.50e+11
 4.4960e+11  0.0000e+00  0.0000e+00  4.9800e+04  5.9740e+24       cat.gif
 3.2790e+11  0.0000e+00  0.0000e+00  3.4100e+04  6.4190e+23       dog.gif
 2.7900e+10  0.0000e+00  0.0000e+00  7.7900e+04  3.3020e+23     mouse.gif
 0.0000e+00  0.0000e+00  0.0000e+00  6.0000e+00  1.9890e+30  squirrel.gif
 5.0820e+11  0.0000e+00  0.0000e+00  7.5000e+04  4.8690e+24       fox.gif

This file contains an example of data stored in a text file 

main.cpp

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

using namespace std;

int main( int argc, char* argv[ ] )
{
      float xPosition, yPosition;
      float xVelocity, yVelocity;
      float animalMass;
      string imgFilename;
      string line;
      istringstream inputStream( line );
      auto N = 0;   // Number of items
      auto R = 0; // Real number from file

  cout << "begin" << endl;
  if( argc > 1 )
  {
    string fileName = argv[ 1 ];
    ifstream inputFile( fileName );
    inputFile.open( fileName, ios::in );

    if( !inputFile.is_open( ))
    {
      cout << setw( 5 ) << " " << "Could not open file " << fileName << "." << endl;
      cout << setw( 5 ) << " " << "Terminating program." << endl;
      exit( 1 );
    }
    else
    {
      cout << inputFile.tellg() << endl;
      inputFile >> N;
      inputFile >> R;
      cout << "N is now " << N << endl;
      cout << "R is now " << R << endl;
      cout << inputFile.tellg() << endl;

      while( inputFile >> xPosition >> yPosition
                       >> xVelocity >> yVelocity
                       >> animalMass   >> imgFilename )
      {
        cout << xPosition << " " << imgFilename << endl;
      }       
    }
  } 
}

ВЫХОД:

os: ~ / Desktop / test$ ./main data.txt

begin

-1

N теперь 0

R теперь 0

-1


Как минимум, я ожидал бы, что N будет равно 5, поскольку у меня может быть неправильный тип для R или, возможно, потребуется больше вычислений после чтения данных, я не уверен.Я просто не понимаю, почему указатель файла показывает, что он находится в месте -1. ​​

1 Ответ

0 голосов
/ 24 февраля 2019

Скорее всего, проблема вызвана объявлением R.

auto R = 0;

Приведенное выше объявление создает R int, а не double или float.

Использование

double R = 0;

Вы можете использовать

auto R = 0.0;

но я не рекомендую это.Использование auto имеет смысл, когда тип является длинным и сложным для ввода.Для простых типов, как указано выше, лучше быть явным.

Если вам нужно использовать float для R, используйте

float R = 0;
...