我正在尝试将字符文件读入64个字符的数组中。文件读取发生在main()
int main (int argc, char **argv)
{
FILE *fp;
char write_msg[BUFFER_SIZE];
fp = fopen("test.data", "r");
int i;
for ( i = 0; i < (BUFFER_SIZE-1); i++){
fscanf(fp, "%s\n", &write_msg[i]);
printf ("printing in the for loop");
}
fclose(fp);
printf("Starting the main().\n");
printf("in Reader, the msg is: %s\n",write_msg);
pid_t pid;
int fd[2];
我一直遇到段错,我不确定我在做什么
答案 0 :(得分:1)
fscanf(fp, "%s\n", &write_msg[i]);
应为fscanf(fp, "%c\n", &write_msg[i]);
,您不希望将字符串扫描到字符中。
write_msg应该以'\ 0',write_msg[BUFFER_SIZE-1]=0
答案 1 :(得分:0)
我在您的代码中看到以下问题:
fscanf(fp, "%s\n", &write_msg[i]);
您正在尝试读取从循环中移动的位置i开始的字符串。当我到达为字符串write_msg保留的内存末尾时,很容易出现分段错误。
另一个建议:对你的fp描述符进行验证:
fp = fopen("test.data", "r");
if ( fp == NULL ) {
/* Show an error and exit */
}
如果因任何原因无法读取文件,fp将为NULL,并且会引发分段错误。
答案 2 :(得分:0)
您正在将一个字符串(可能相当长)扫描到一个缓冲区中,而不限制将读取多少个字符。你不应该这样做。然后,您将i
递增1,即使字符串可能更长。您应该使用fgets
或fread
将整个文件读入缓冲区,因为您确实不需要fscanf
的特殊功能,并且这些函数将需要一定长度的字符读。或者如果你真的非常喜欢你的for循环,你可以使用fgetc
,它完全符合你的想法fscanf
。