【问题标题】:Segmentation fault in file I/O, cannot figure out文件 I/O 中的分段错误,无法确定
【发布时间】:2021-08-11 05:13:19
【问题描述】:

基本上,我已经重写了运行时不断给我一个分段错误(核心转储)错误的代码,我决定检查每个步骤以排除问题。

我的代码有效,直到我尝试访问/使用输入文件数据的最后一行。我对这一行和前一行做同样的事情,但它表明有问题。

这是我的文件 I/O 和数据处理代码:

输入文件本身就是:

20 20
10 10 u
5 5 d

【问题讨论】:

  • 顺便说一句,通常的做法是将您的代码包含在问题本身中,并且作为文本而不是图像。您希望尽可能地让我们更轻松地为您提供帮助。鉴于您对网站的新认识,我们可能会原谅一次,但建议您以后再这样做,以免不必要地关闭您的问题。通常我会为新手解决这个问题,但我要转录很多代码,尤其是当你可以更轻松地剪切和粘贴文本时。
  • 我上面的最后一句话是对您应该如何处理this问题的建议。不要等待下一个问题:-)
  • 您可以通过多种方式格式化代码。一种是在每一行代码前加上四个空格(如果你想要缩进,可以更多)。我已经以另一种方式解决了您的问题,方法是使用三个反引号(和语言)(例如 <backtick><backtick><backtick>c++)开始代码块,并仅以三个反引号结束它。这些反引号行需要在自己的行上。
  • Eeknormous,由于您还没有将代码粘贴为文本,我想我至少可以将 image 带入问题并调整其大小,使其可读,所以我们无需点击链接即可访问。但是,您确实应该在某个时候将其替换为文本。

标签: file-io segmentation-fault c89


【解决方案1】:

在第 27 行,您取消引用未初始化的 playerDirInput,这是未定义的行为:

playerDir = (char)playerDirInput[0];

可能是你崩溃的原因。如果该代码块旨在反映以下代码块,那么您似乎还没有阅读该行的第三项,这可能是 playerDirInput 的来源。就像这样:

fgets(line, 8, f);

playerRowChar = strtok(line, " ");
playerRow = atoi(playerRowChar);

playerColChar = strtok(NULL, " ");    // <- fixed this, see below.
playerCol = atoi(playerColChar);

playerDirInput = strtok(NULL, " ");   // <- add this.
playerDir = (char)playerDirInput[0];

但是,我建议您改为选择更简单的 sscanf 版本,它类似于(包括检查以确保您获得三个项目):

fgets(line, 8, f);
if (sscanf(line, "%d %d %c", &playerRow, &playerCol, &playerDir) != 3) {
    handleErrorIntelligently();
}

我更喜欢fgets,然后是sscanf,而不是fscanf。后者可能会失败,以至于您不确定输入流指针的最终位置。使用fgets,您始终知道您已经阅读了一行(或者可以轻松检测到您阅读了部分行并进行调整)。


您应该关注的其他潜在问题:

  • 在第 25 行,这个 strtok 应该是 NULL 类型,而不是 line。后者将简单地重新读取该行中的第一项,而您需要下一项。
  • 您确实应该检查可能返回有问题值的函数(例如strtok 中的NULL)。否则,使用它们可能会导致问题。当然,这取决于您正在读取的数据,因此如果您控制它,可能不一定会成为问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    相关资源
    最近更新 更多