从函数重置返回的变量为零

时间:2017-03-03 12:18:27

标签: c++ function return

这是一个程序,它将读取输入文件中的数字并将它们放入一个数组中,然后将它们升序排序并将它们打印到输出文件中。

编译时没有错误,但是当程序运行时,它将正确计算文件中的数字并存储它们,直到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;
}

5 个答案:

答案 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);