我正在编写一个代码,它只读取文本文件的第一行,然后将其输出到新的文本文件。我收到名为“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下面的所有其他行。
答案 0 :(得分:1)
可能有几件事,但这里有一些:
Today is Tuesday
至少包含17个字符,但您正在阅读line[i]
,其中最多可包含10个字符的空格。你将会读到所有可能的字符sizeof line
字符,因为sizeof line
对你来说是1280(比10大得多)fclose ( inputFile );
关闭输入文件并尝试再次读取它。这听起来像是未定义的行为。答案 1 :(得分:1)
您的解释和代码在每个细节上都不匹配,只是想指出可能发生了细分错误的位置:
您正在尝试将第一行读入行[1],该行已经分配了10个字符空间 - 并且您正在读取sizeof行,即128 * 10 = 1280.这已经超出了缓冲区你分配了(10 <&lt; 1280)。 字符串&#34;今天是星期二&#34;已超过10个字符,因此除了第[1]行之外,您正在访问您不想要的地方。 (我猜你是想宣布第[10] [128]行)
即使在读取第一个语句后,while循环仍继续运行,但您已在第一个循环中关闭了inputFile。然后,您将尝试从一个甚至没有打开的文件中读取。
某些调试有助于精确定位发生段错误的代码中的确切行。
但是分段错误只是众多可见问题中的一个,因此我建议您从一开始就重写代码。 例如,如果您只是读第一行,那么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]);
}
}