#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <fstream>
using namespace std;
void make_array(ifstream &num, int (&array)[50]);
int main(){
ifstream file; // variable controlling the file
char filename[100]; /// to handle calling the file name;
int array[50];
cout << "Please enter the name of the file you wish to process:";
cin >> filename;
cout << "\n";
file.open(filename);
if(file.fail()){
cout << "The file failed to open.\n";
exit(1);
}
else{
cout << "File Opened Successfully.\n";
}
make_array(file, array);
file.close();
return(0);
}
void make_array(ifstream &num, int (&array)[50]){
int i = 0; // counter variable
while(!num.eof() && i < 50){
num >> array[i];
i = i + 1;
}
for(i; i>=0; i--){
cout << array[i] << "\n";
}
}
好吧,所以这是我的代码到目前为止。当我输出数组的内容时,我在预期输出之前得到两个非常大的负数。例如,如果文件中包含1 2 3 4,则我的程序输出-6438230 -293948 1 2 3 4.
有人可以告诉我为什么我会得到这些荒谬的价值观吗?
答案 0 :(得分:3)
您的代码向后输出数组,并且在读完所有值后,它会递增i
两次。这就是您在开始时看到两个垃圾值的原因。我怀疑你误报了你的输出,你实际上看到了-6438230 -293948 4 3 2 1
。
您最终会获得额外的增量,因为您使用eof()
是错误的。出于某种原因,这是一个非常常见的错误。 See here for further info。写下你的循环代替:
while ( i < 50 && num >> array[i] )
++i;
现在i
保存列表中的有效项目数。假设你确实想要向后输出它们:
while ( i-- > 0 )
cout << array[i] << "\n";
要向前输出它们,您需要两个变量(一个用于存储数组中的项目总数,另一个用于执行迭代)
答案 1 :(得分:0)
支票!num.eof()
仅告诉您,您阅读的最后一件事不是eof。因此,如果您的文件为1 2 3 4
,那么只有在5
num>>array[i]
来电之后,该检查才能启用。但是,对于i
,array[i]
将填充无意义的值。处理eof
的唯一正确方法是在每次调用operator>>
时检查其有效性。换句话说,正确的条件只是num>>array[i]
。这可以通过将此conversion用于bool
从C ++ 11到void*
pre-C ++ 11来实现。