获取分段错误(核心转储错误)

时间:2018-02-22 06:10:43

标签: c

我正在编写一个代码,它只读取文本文件的第一行,然后将其输出到新的文本文件。我收到名为“Segmentation Fault”的错误。我无法理解这个错误背后的原因。

FILE *inputFile = fopen("input1.txt", "r" );
FILE *outputFile = fopen("output1.txt", "w" );
int i=0;
char line [128][10];
if ( inputFile != '\0' ) {
   while ( fgets ( line[i], sizeof line, inputFile ) != '\0'  ) {
       i++;
       fclose ( inputFile );
   }
}
for(int j=0;j<i;j++) {
    printf("%s",line[j]);
    fprintf(outputFile,"%s",line[j]);
}

文本文件包含      1)今天是星期二      2)明天是星期三          ....等等(最多10行)

我试图只读取第1行,然后立即显示到stdout.Ignoring下面的所有其他行。

3 个答案:

答案 0 :(得分:1)

可能有几件事,但这里有一些:

  1. Today is Tuesday至少包含17个字符,但您正在阅读line[i],其中最多可包含10个字符的空格。你将会读到所有可能的字符sizeof line字符,因为sizeof line对你来说是1280(比10大得多)
  2. 假设您已成功读取第一行,然后使用fclose ( inputFile );关闭输入文件并尝试再次读取它。这听起来像是未定义的行为。
  3. You need a rubber duck to talk to.

答案 1 :(得分:1)

您的解释和代码在每个细节上都不匹配,只是想指出可能发生了细分错误的位置:

  1. 您正在尝试将第一行读入行[1],该行已经分配了10个字符空间 - 并且您正在读取sizeof行,即128 * 10 = 1280.这已经超出了缓冲区你分配了(10 <&lt; 1280)。 字符串&#34;今天是星期二&#34;已超过10个字符,因此除了第[1]行之外,您正在访问您不想要的地方。 (我猜你是想宣布第[10] [128]行)

  2. 即使在读取第一个语句后,while循环仍继续运行,但您已在第一个循环中关闭了inputFile。然后,您将尝试从一个甚至没有打开的文件中读取。

  3. 某些调试有助于精确定位发生段错误的代码中的确切行。

    但是分段错误只是众多可见问题中的一个,因此我建议您从一开始就重写代码。 例如,如果您只是读第一行,那么while语句本身也是不必要的。

答案 2 :(得分:0)

更正代码

#include "stdio.h"
int main(void) {
  FILE *inputFile = fopen("input1.txt", "r" );
  FILE *outputFile = fopen("output1.txt", "w" );
  int i=0;
  char line [128][10];
  if ( inputFile )
  {
    while (fgets ( line[i], sizeof line[i], inputFile ) )
    {
      i++;
    }
    fclose ( inputFile );
  }
  for(int j=0;j<i;j++)
   {
     printf("%s",line[j]);
     fprintf(outputFile,"%s",line[j]);
   }
}