ifstream随机整数?

时间:2010-09-26 02:18:19

标签: c++ arrays

我一直试图从文件读取整数做一些操作并将它们输出到另一个文件。当我将整数输入到数组中然后打印出随机数的结果。这与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 ++很陌生,并且讨厌数组与其他语言相比的行为方式。

3 个答案:

答案 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个项目在阵列中。

修改其他答案中添加的建议