【问题标题】:Pointers, passing arguments to main, and segfaults指针,将参数传递给 main 和段错误
【发布时间】:2012-07-16 23:14:39
【问题描述】:

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

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

它编译得很好,但是当我使用一个简单的输入文本文件执行时,我遇到了分段错误。我已经搜索了多个教程,但我不知道为什么。任何帮助将不胜感激。

【问题讨论】:

  • 你通过命令行传递了什么参数(argv)?
  • @Aesthete 只有一个文件名。 testRead.txt 它被称为。
  • 您是否检查过您是否有足够的权限来读取该文件?
  • 如果我了解权限的工作原理(我可能不了解),那么我想我知道。无论如何,它在我的主目录中。 (我在 OSX 上)

标签: c++ pointers segmentation-fault command-line-arguments


【解决方案1】:

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

  • argv[1] 不存在,在这种情况下尝试访问它可能会导致段错误。勾选if (argc > 1) 即可避免此问题。
  • fopen 没有成功打开文件,在这种情况下尝试从文件中读取 (fgets) 或 fclose 会导致分段错误。在调用 fopen 之后,您应该立即检查返回值是否不是 NULL,例如if (dataFile == NULL)

【讨论】:

  • 谢谢,我检查了这些东西,实际上返回值为NULL。我将文件中的数据复制粘贴到另一个文件中,然后一时兴起重新保存它,没想到它会起作用,但它确实起作用了。我不知道原始文件有什么问题,因为它也只是一个 .txt 文件。我仍然有些困惑,但很高兴它现在可以工作了。
【解决方案2】:

您应该在此处检查一些事项。它可能仍然无法达到您的预期,但它会避免您遇到的错误。

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' for more information.

【讨论】:

  • 感谢您的建议。这对我很有帮助,因为我正在尝试开发更好的编码实践。在阅读您的帖子后,我实际上还有另一个问题。我现在正在尝试读取多行文件的每一行,直到到达文件末尾并且遇到了很多麻烦。我可以使用循环并检查字符串是否为 NULL 以指示文件结束吗? (另外,如果我将此作为新问题发布会更好吗?)
  • 看看std::stringstream,`std::getline' 和他们的相关类。这应该让你开始 - stackoverflow.com/questions/132358/…
猜你喜欢
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 2016-11-07
相关资源
最近更新 更多