1

我正在尝试将字符文件读入 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];

我不断收到段错误,我不确定我在做什么

4

3 回答 3

1

fscanf(fp, "%s\n", &write_msg[i]);应该是fscanf(fp, "%c\n", &write_msg[i]);,您不想将字符串扫描成字符。

并且 write_msg 应该以 '\0' 结尾,write_msg[BUFFER_SIZE-1]=0

于 2012-10-01T05:10:09.120 回答
0

我在您的代码中看到以下问题:

fscanf(fp, "%s\n", &write_msg[i]);

您正在尝试读取从位置 i 开始在循环内移动的字符串。当 i 到达为字符串 write_msg 保留的内存末尾时,很容易出现分段错误。

另一个建议:对您的 fp 描述符进行验证:

fp = fopen("test.data", "r");
if ( fp == NULL ) {
    /* Show an error and exit */
}

如果由于任何原因无法读取文件,则 fp 将为 NULL 并且会引发分段错误。

于 2012-10-01T05:11:18.447 回答
0

您正在将一个可能相当长的字符串扫描到缓冲区中,而不限制将读取多少个字符。你不应该那样做。然后你会加i一,即使字符串可能更长。您应该使用fgetsorfread将整个文件读入缓冲区,因为您确实不需要 的特殊功能fscanf,并且这些功能需要一定长度的字符才能读取。或者,如果你真的很喜欢你的 for 循环,你可以使用fgetc,它完全符合你的想法fscanf

于 2012-10-01T05:12:46.557 回答