C - 读取数据文件时的分段错误



我正在尝试将字符文件读取为 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, "%sn", &write_msg[i]);
      printf ("printing in the for loop");
    }
    fclose(fp);
    printf("Starting the main().n");
    printf("in Reader, the msg is: %sn",write_msg);
    pid_t pid;
    int fd[2];

我一直遇到赛格错误,我不确定我在做什么

fscanf(fp, "%sn", &write_msg[i]);应该fscanf(fp, "%cn", &write_msg[i]);,您不想将字符串扫描到字符中。

write_msg应以"\0"结尾,write_msg[BUFFER_SIZE-1]=0

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

fscanf(fp, "%sn", &write_msg[i]);

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

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

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

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

您正在将可能相当长的字符串扫描到缓冲区中,而不限制将读取的字符数。你不应该那样做。然后,您将i递增 1,即使字符串可能要长得多。您应该使用 fgetsfread 将整个文件读入缓冲区,因为您真的不需要 fscanf 的特殊功能,并且这些函数将需要一段字符来读取。或者,如果你真的喜欢你的 for 循环,你可以使用 fgetc ,它完全按照你认为fscanf正在做的事情。

相关内容

  • 没有找到相关文章

最新更新