2017-03-03 97 views
1

这是一个程序,它将读取输入文件中的数字并将它们放入数组中,然后按升序对它们进行排序并将它们打印到输出文件中。从函数reset返回的变量

编译时没有错误,但程序运行时它会正确计数文件中的数字个数并存储它们,直到numsize返回到邮件函数为零。

我测试了这个循环打印什么numsize是每次,它不是直到main()函数时,它变回零。

我唯一的猜测是,我无法正常返回变量,或者也许不正确,宣布它

int store (int arg[20], int numsize, istream& infile) 
{ 
    numsize = 0; 
    if(numsize<20) 
    { 
    infile >> arg[numsize]; 
    } 
    while(!infile.eof()) 
    { 
    numsize++; 
    if(numsize<20) 
    { 
     cout << numsize; 
     infile >> arg[numsize]; 
    } 
    } 
    return numsize; 
} 

int printarray (int arg[20], int numsize, ostream& outfile) 
{ 
    for (int i = 0; i<= numsize; i++) 
    { 
    outfile << arg[i] << endl; 
    }  
    return 0; 
} 

int main() 
{ 
    int arg[20]; 
    int numsize; 

    std::string input_filename, output_filename; 
    ofstream out_file; 
    ifstream in_file; 

    cout << "Please enter name of input file: "; 
    cin >> input_filename; 
    in_file.open(input_filename.c_str()); 
    if (!in_file) 
    { 
    cout << "Could not open input file\n"; 
    return 0; 
    } 

    cout << "Please enter name of output file: "; 
    cin >> output_filename; 
    out_file.open(output_filename.c_str()); 
    if (!out_file) 
    { 
    cout << "Could not open output file\n"; 
    return 0; 
    } 

    store(arg, numsize, in_file); 
    cout << numsize << "numbers were read from the input file" << endl; 
    printarray(arg, numsize, out_file); 

    return 0; 
} 
+1

'numsize = 0; if(numsize <20)'?另外,如果这个if不能通过,你的循环在读取任何东西之前增加'numsize',这意味着你的数组的第一个元素是未初始化的。最后,你的['while(!eof())'是错误的。](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong)。你永远不会确保整数被实际读取。 – chris

回答

2

至少有两种方法修复它:

1)如果你不想允许功能通过这条线

numsize = store(arg, numsize, in_file); 

2)您也可以只需更换这行

int store (int arg[20], int numsize, istream& infile) 

:,以改变它的第二个参数,只需更换这行:此行

store(arg, numsize, in_file); 

int store (int arg[20], int& numsize, istream& infile) 

(在此c ASE你的函数store()就能改变数值numsize

而且我建议你改变功能store()这样:

int store (int arg[20], istream& infile) 
{ 
    int numsize = 0; 
    while((numsize<20) && (infile >> arg[numsize])) 
    { 
    numsize++; 
    cout << numsize; 
    } 
    return numsize; 
} 

,并呼吁这样说:

numsize = store(arg, in_file); 
2

您需要通过引用store()通过numsize
变化

int store (int arg[20], int numsize, istream& infile) 

int store (int arg[20], int& numsize, istream& infile) 

此外,要么改变store()返回类型void,或者从它返回一个int(即numsize?)

3

由于numsize是按值传递的,因此在退出时丢弃store内的任何修改。您需要将返回值赋给回numsize

numsize = store(arg, numsize, in_file); 

注:你在你的store功能使用numsize就好像它是一个局部变量,因为你为它分配零的时候了。千万不要错过它在所有:

int store (int arg[20], istream& infile) { 
    int numsize = 0; 
    while(numsize < 20 && (infile >> arg[numsize])) { 
     numsize++; 
     cout << numsize; 
    } 
    return numsize; 
} 

也不要使用infile.eof(),这是一个不正确的使用模式

2

你应该写至少像

numsize = store(arg, numsize, in_file); 

这将是更正确的声明功能如

size_t store (int arg[], size_t n, istream& infile); 

其中参数n表示数组中元素的数量。否则该函数将取决于魔法未知数字20.

此外,函数中的循环不正确。该函数可以将最后一个数字放入数组中,因为在将数字存储在数组中之后检查条件eof

功能的实现可以像

size_t store(int arg[], size_t n, istream& infile) 
{ 
    size_t i = 0; 
    int value; 

    while(i < n && infile >> value) arg[i++] = value; 

    return i; 
} 

,并呼吁像

size_t numsize; 

//... 

numsize = store(arg, sizeof(arg)/sizeof(*arg), in_file); 

相应功能printarray应该像

void printarray(int arg[], size_t numsize, ostream& outfile) 
{ 
    for (size_t i = 0; i < numsize; i++) 
         ^^^^^^^^^^^ 
    { 
     outfile << arg[i] << endl; 
    }  
} 
2

当你调用在store功能定义主要功能,然后尝试从函数store保存返回的变量numsize的值。您可以尝试以下代码:

numsize = store(arg, numsize, in_file);