【问题标题】:C++ file writing/readingC++ 文件写入/读取
【发布时间】:2013-03-17 07:11:31
【问题描述】:

我正在尝试创建一个数组,将数组写入文件并显示它。它似乎正在工作,但我只得到了输出的一部分(前 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;
}

【问题讨论】:

  • 这看起来不对:for(i=0;i&lt;arr[i];i++)
  • while (!file.eof()) 也不正确。 while 循环应该在 getline() 结果上进行测试,但您可能不会注意到差异。

标签: c++ arrays file input output


【解决方案1】:

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

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

如果用户输入以下5个ints:

1 0 4 5 6

for 循环将在第二个int 处终止,0,因为1 &lt; 0(这是i&lt;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 循环必须将读取的ints 的数量存储到arr 中,因此其余代码仅处理用户提供的值。使用具有固定大小的数组和指示填充元素数量的变量的替代方法是使用仅包含有效ints 的std::vector&lt;int&gt;(并且可以查询其size() 或迭代使用迭代器)。

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

    while (std::getline(file, inp))
    {
    }
    

【讨论】:

    【解决方案2】:

    就像hmjd说的

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

    看起来不对

    应该是这样的

    int size;
    size=sizeof(your array);
    
    for(i=0;i<size;i++)
    

    【讨论】:

    • 非常感谢。很有帮助!
    【解决方案3】:

    试试这个:

    //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)) 
    

    【讨论】:

    • :) 非常感谢您的快速回答。什么我不知道有多少项目存储在 aray 中?为什么 i
    • 我会像这样用 0 初始化数组: int arr[20] = {0};在这种情况下,您可以使用 while arr[i] != 0 例如。
    • "为什么 i
    • sizeof(arr) 返回数组的大小而不是元素的数量 - 使用 sizeof(arr)/sizeof(int)
    【解决方案4】:
    i<array[i]
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多