C ++,从文件中读取一个数字数组

时间:2016-10-17 17:53:31

标签: c++ io

以下是我的C ++代码的一部分,argv[2]是输入文件的路径。 我发现虽然我在输入文件中得到了正确的元素数(arr_size),但是while循环中的代码似乎没有被执行。结果是arr[]中的所有元素都保留其原始值(0)。

ifstream inFile( argv[2] );

// get the number of element
int arr_size = distance(istream_iterator<int>(inFile), istream_iterator<int>() );

int * arr = new int[arr_size];

int idx(0);
while ( inFile >> arr[idx] ) {
    idx++;
}

我试过了

while ( !inFile.eof() ) {
    inFile >> arr[idx];
    idx++;
}

,但仍然得到相同的结果。

输入文件如下所示:

3 8 7 4 6 2 1 9 0 5

我的代码出了什么问题?

5 个答案:

答案 0 :(得分:1)

在这一行

int arr_size = distance(istream_iterator<int>(inFile), istream_iterator<int>() );

该文件已经读完了。

您必须使用ifstream重置seekg(0)才能重新开始阅读。

同时使用while循环的第一个版本,最好使用std::vector<int>push_back(),而不是自己管理内存。

答案 1 :(得分:1)

这里的问题是,当你做

int arr_size = distance(istream_iterator<int>(inFile), istream_iterator<int>() );

您实际上已阅读该文件以确定istream_iterator可以前进的次数。当您从文件读入数组时,您已经在文件的末尾,并且不会读取任何内容。

要解决这个问题,您需要回头查看文件的开头,或者不要使用newdelete使用std::vector之类的

std::vector data(istream_iterator<int>(inFile), istream_iterator<int>() );

现在你有一个载满文件内容的载体。

答案 2 :(得分:1)

我怀疑是电话

int arr_size = distance(istream_iterator<int>(inFile), istream_iterator<int>() );

inFile放在最后。

您需要使用seekg

将其重置为指向开头
// Clear the state of the stream before calling seekg.
inFile.clear();
inFile.seekg(0);

应该这样做。

答案 3 :(得分:0)

我强烈建议您更改代码以使用std::vector

std::vector<int> database;
int datum = 0;
while (my_data_file >> datum)
{
  database.push_back(datum);
}

这消除了确定文件中数字数量,然后分配内存量(正确)和传递指针,最后删除内存的令人讨厌的问题。

答案 4 :(得分:0)

std::istream_iterator<T>输入迭代器:您只需迭代序列一次。增加输入迭代器会消耗相应的元素。您需要一个更强的迭代器,例如转发迭代器来遍历序列多次。

如果您的输入流是实际文件,您可以再次打开它或clear()流,然后seekg()到流的开头再次读取它。我个人通过单个传递将其读入一个适当可调整大小的数组,可能是std::vector<T>

请注意,您的第一个循环是读取元素的首选方法(不使用迭代器时)。使用eof()是错误的!您确实需要在尝试读取流之后检查流的状态