0

我正在尝试创建一个数组,将数组写入文件并显示它。它似乎正在工作,但我只得到了输出的一部分(前 3 个元素),或者我得到了超出边界的值。

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
      int arr[20];
      int i;

      for (i = 0; i < 5; i++)
      {
            cout << "Enter the value to the array: " << endl;
            cin >> arr[i];
      }
      ofstream fl("numbers.txt");

      if (!fl)
      {
            cout << "file could not be open for writing ! " <<endl;

      }
      for (i = 0; i < arr[i]; i++)
      {
            fl<<arr[i]<<endl;
      }
      fl.close();
      ifstream file("numbers.txt");
      if(!file)
      {
            cout << "Error reading from file ! " << endl;
      }
      while (!file.eof())
      {
             std::string inp;
             getline(file,inp);
             cout << inp << endl;
      }
      file.close();
      return 0;
}
4

4 回答 4

2

循环中的终止条件for不正确:

for(i=0;i<arr[i];i++)

如果用户输入以下 5int秒:

1 0 4 5 6

循环将在第二个, the处for终止,因为(这将等同于) is 。代码有可能访问超出数组边界的输入:int01 < 0i<arr[i]false

10 11 12 13 14

循环将for遍历前 5 个元素并开始处理数组中的未初始化值,arr因为它尚未初始化:

int arr[20];

如果其中的元素arr恰好总是大于i.

一个简单的修复:

for(i=0;i<5;i++)

其他要点:

  • 始终检查 I/O 操作的结果以确保变量包含有效值:

    if (!(cin >> arr[i]))
    {
        // Failed to read an int.
        break;
    }
    

for循环必须将读取的 s 数存储到intarr,因此其余代码仅处理用户提供的值。使用具有固定大小的数组和指示填充元素数量的变量的替代方法是使用std::vector<int>仅包含有效ints 的 a (并且可以对其进行查询size()或使用迭代器进行迭代)。

  • while (!file.eof())不正确,因为只有在尝试读取超出文件末尾时才会设置文件结束标志。立即检查 I/O 操作的结果:

    while (std::getline(file, inp))
    {
    }
    
于 2013-03-27T09:02:20.570 回答
1

尝试这个:

//for(i=0;i<arr[i];i++)
for(i=0;i<5;i++)

[编辑] 我会像这样用 0 初始化数组: int arr[20] = {0}; 在这种情况下,您可以使用例如:

while ((arr[i] != 0 || i < sizeof(arr)) 
于 2013-03-27T08:57:23.543 回答
1

就像hmjd说的

for(i=0;i<arr[i];i++)

看起来不对

它应该看起来像这样

int size;
size=sizeof(your array);

for(i=0;i<size;i++)
于 2013-03-27T09:03:20.737 回答
-1
i<array[i]

这是错误的,因为它与数组的内容相关,它不检查数组的大小。

于 2014-03-18T11:42:51.703 回答