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

forループは2番目intので0終了し1 < 0ます。コードには、入力のために配列の境界を超えてアクセスする可能性があります。i<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のみを含む(イテレータを使用してクエリ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で初期化します。intarr[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 に答える