这是一个程序,它将读取输入文件中的数字并将它们放入一个数组中,然后将它们升序排序并将它们打印到输出文件中。
编译时没有错误,但是当程序运行时,它将正确计算文件中的数字并存储它们,直到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;
}
答案 0 :(得分:4)
由于numsize
是按值传递的,因此在退出时会丢弃store
内对它的任何修改。您需要将返回值分配回numsize
:
numsize = store(arg, numsize, in_file);
注意:您在numsize
函数中使用store
就像它是一个局部变量一样,因为您立即将其赋值为零。根本不要通过它:
int store (int arg[20], istream& infile) {
int numsize = 0;
while(numsize < 20 && (infile >> arg[numsize])) {
numsize++;
cout << numsize;
}
return numsize;
}
也不要使用infile.eof()
,这是一种不正确的使用模式
答案 1 :(得分:3)
您需要在numsize
中通过引用传递store()
改变
int store (int arg[20], int numsize, istream& infile)
到
int store (int arg[20], int& numsize, istream& infile)
另外,要么将store()
返回类型更改为void
,要么从中返回一个int(即numsize
?)
答案 2 :(得分:3)
至少有两种方法可以解决它:
1)如果您不想让函数store()
更改它的第二个参数,只需替换此行:
store(arg, numsize, in_file);
这一行:
numsize = store(arg, numsize, in_file);
2)你也可以直接替换这一行
int store (int arg[20], int numsize, istream& infile)
通过这一行
int store (int arg[20], int& numsize, istream& infile)
(在这种情况下,您的函数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);
答案 3 :(得分:3)
你应该写至少像
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;
}
}
答案 4 :(得分:2)
当您在main函数中调用store
函数时,请尝试从函数numsize
中保存返回变量store
的值。您可以尝试以下代码:
numsize = store(arg, numsize, in_file);