以下是我的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
我的代码出了什么问题?
答案 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
可以前进的次数。当您从文件读入数组时,您已经在文件的末尾,并且不会读取任何内容。
要解决这个问题,您需要回头查看文件的开头,或者不要使用new
和delete
使用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()
是错误的!您确实需要在尝试读取流之后检查流的状态。