数组输出错误

时间:2014-10-29 03:54:11

标签: c++

#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.

有人可以告诉我为什么我会得到这些荒谬的价值观吗?

2 个答案:

答案 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]来电之后,该检查才能启用。但是,对于iarray[i]将填充无意义的值。处理eof的唯一正确方法是在每次调用operator>>时检查其有效性。换句话说,正确的条件只是num>>array[i]。这可以通过将此conversion用于bool从C ++ 11到void* pre-C ++ 11来实现。