ifstream没有返回正确的int值

时间:2015-09-23 11:48:52

标签: c++ file-io ifstream

我想创建一个工厂类,它从文件中创建和加载对象; 但是,当我尝试从文件中读取int时,它似乎返回了错误的数字。

std::ifstream input;
input.open("input.txt");
if (!input.is_open()){
    exit(-1);

}

int number;

input >> number;
cout << number;

input.close();

当我在input.txt文件中输入一个数字时,显示:-858993460。 更改数字并没有什么区别,当我使用cin而不是ifstream时,它会像它应该的那样工作。我可能只是错过了一些非常愚蠢的东西,但我无法弄明白。

编辑:使用getLine()可以正常工作。我猜使用&gt;&gt;。

时出现问题

1 个答案:

答案 0 :(得分:0)

这是打开文件的另一种解决方案:逐行阅读:

string line;
ifstream myfile("input.txt");
if (myfile.is_open())
{
  while ( getline (myfile,line) )
  {
    cout << line << '\n'; // Use this to verify that the number is outputed
    // Here you can transform your line into an int:
    // number = std::stoi(line);
  }
  // myfile.close(); Use this if you want to handle the errors
}

else cout << "Unable to open file";

如果您不想逐行阅读,只需删除while

...
getline(myfile,line);
number = std::stoi(line);
...

在一行中读取多个数字

输入文件的图像如下:

  

1,2.3,123,11

     

1,2

     

0.9,90

然后,您可以使用这段代码读取所有数字:

string line;
ifstream myfile("input.txt");
string delimiter = ", ";

if (myfile.is_open())
{
  while ( getline (myfile,line) )
  {
    cout << "Reading a new line: " << endl;
    size_t pos = 0;
    string token;
    while ((pos = line.find(delimiter)) != string::npos) {
      token = line.substr(0, pos);
      cout << token << endl; // Instead of cout, you can transform it into an int
      line.erase(0, pos + delimiter.length());
    }
  }
}
else cout << "Unable to open file";

输出将是:

Reading a new line: 
1
2.3
123
11
Reading a new line:
1
2
Reading a new line:
0.9
90

可能有效的新解决方案=)

我没有对此进行测试,但显然有效:

std::ifstream input;
double val1, val2, val3;
input.open ("input.txt", std::ifstream::in);
if (input >> val1 >> val2 >> val3) {
  cout << val1 << ", " << val2 << ", " << val3 << endl;
}
else
{
  std::cerr << "Failed to read values from the file!\n";
  throw std::runtime_error("Invalid input file");
}

要检查IO,请参阅http://kayari.org/cxx/yunocheckio.html