0

タイトルで言及されている3つのことは私にはやや新しいものです。私はそれらすべてに概念的に精通していますが、C ++で最初から独自のプログラムを作成しようとしたのはこれが初めてであり、これら3つすべてが関係しています。コードは次のとおりです。

int main(int argc, char *argv[])
{
FILE *dataFile;
char string [180];
dataFile = fopen(argv[1],"r");
fgets(string,180,dataFile);
fclose(dataFile);
}

正常にコンパイルされますが、単純な入力テキストファイルを使用して実行すると、セグメンテーション違反が発生します。複数のチュートリアルを検索しましたが、その理由がわかりません。どんな助けでもいただければ幸いです。

4

2 に答える 2

2

コードのセグメンテーション違反には、次の2つの原因が考えられます。

  • argv[1]は存在しません。その場合、アクセスしようとするとセグメンテーション違反が発生する可能性があります。if (argc > 1)この問題を回避するためにチェックしてください。
  • fopenはファイルを正常に開きません。この場合、ファイルから読み取ろうとすると(fgets)、またはfcloseセグメンテーション違反が発生します。fopenを呼び出した直後に、戻り値が次のようになっていないことを確認する必要がありNULLますif (dataFile == NULL)
于 2012-07-18T00:15:26.980 に答える
1

ここで確認する必要があることがいくつかあります。それでも期待どおりの動作をしない可能性がありますが、発生するエラーを回避できます。

int main(int argc, char** argv)
{
  if(argc > 1) // FIRST make sure that there are arguments, otherwise no point continuing.
  { 
    FILE* dataFile = NULL; // Initialize your pointers as NULL.
    const unsigned int SIZE = 180; // Try and use constants for buffers. 
                                      Use this variable again later, and if 
                                      something changes - it's only in one place.
    char string[SIZE];
    dataFile = fopen(argv[1], "r");
    if(dataFile) // Make sure your file opened for reading.
    {
      fgets(string, SIZE, dataFile); // Process your file.
      fclose(dataFile); // Close your file.
    }
  }
}

この後stringもNULLになる可能性があることに注意してください。詳細については、「fgets」を参照してください。

于 2012-07-18T00:24:15.490 に答える