我想创建一个工厂类,它从文件中创建和加载对象;
但是,当我尝试从文件中读取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;。
答案 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");
}