0

标题中提到的三件事对我来说有些新鲜。我在概念上熟悉所有这些,但这是我第一次尝试用 C++ 从头开始​​编写自己的程序,它涉及所有这三件事。这是代码:

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

您的代码中有两个可能的分段错误原因:

  • 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 回答