我一直试图从文件读取整数做一些操作并将它们输出到另一个文件。当我将整数输入到数组中然后打印出随机数的结果。这与ifstream有什么关系,我不明白或者我错过了一些明显的东西吗?
#include<iostream>
#include<fstream>
using namespace std;
int main(){
int i=0, test[100];
ifstream reader("in.txt");
while(!reader.eof()){
reader>>test[i];
i++;
}
for(int x=0; test[x]!=-1; x++)
cout<<test[x]<<endl;
return 0;
}
in.txt示例:
1 4 3 2 9 8 18 22 0
2 4 8 10 0
7 5 11 13 1 3 0
-1
0和-1分别是eol和eof的哨兵
如果有一种更简单的方法,我也想知道这一点。我对C ++很陌生,并且讨厌数组与其他语言相比的行为方式。
答案 0 :(得分:1)
sizeof(test)/sizeof(test[0])
这是一个编译时计算:它总是会产生100个。如果你想知道你实际读了多少个整数,你需要自己跟踪它(或者使用一个容器来跟踪它,就像std::vector
)。
此外,在循环条件中测试.eof()
不正确,循环不会在正确的时间终止。如果提取失败,将设置流上的失败状态,并且进一步提取将失败。正确的方法是:
// make sure to test the array bound and test that the extraction succeeded:
while((i < 100) && (reader >> test[i]))
{
i++;
}
然后,您可以测试流的状态,以确定由于提取失败或是否达到EOF而导致循环结束。如果不是这种情况,则i
应为100,您将填充数组。
您可以阅读this article,了解为何这是正确的方法。
答案 1 :(得分:1)
明显更简单的方法是使用std :: vector:
#include <vector>
#include <iostream>
#include <algorithm>
#include <numeric>
#include <fstream>
#include <iterator>
int main() {
std::vector<int> test;
std::ifstream reader("in.txt");
// read the data into the vector:
std::copy(std::istream_iterator<int>(reader),
std::istream_iterator<int>(),
std::back_inserter(test));
// show the data in the vector:
std::copy(test.begin(),
test.end(),
std::ostream_iterator<int>(std::cout, "\t"));
// Just for fun, display the average of the numbers:
std::cout << "Mean = "
<< std::accumulate(test.begin(), test.end(), 0) / test.size();
return 0;
}
答案 2 :(得分:0)
使用矢量而不是数组。
vector<int> test
文件的文本中是否有0和-1?我可能会在这一点上误解你,但它们不应该在文本文件中。
所以,试试这个:
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main(){
int i=0, tmp;
vector<int> test;
ifstream reader("in.txt");
while((i < 100) && (reader >> tmp))
{
test.push_back(tmp);
i++;
}
for(int x=0; x < test.size(); x++)
cout<<test[x]<<endl;
return 0;
}
你的代码中最大的缺陷就是你在将数组设置为100后使用了数组的大小。这与读入的整数数量不同,因此它将继续打印所有100个项目在阵列中。
修改其他答案中添加的建议