【问题标题】:segmentation fault on reading in a data file读取数据文件时出现分段错误
【发布时间】:2012-10-01 05:08:07
【问题描述】:

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

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

【问题讨论】:

  • 在 for 循环中的 printf 中添加一个换行符,这样它就不会被缓冲。在段错误之前你能走多远?
  • 问题 #1:不检查“fopen()”错误。问题#2:什么是“BUFFER_SIZE”,你确定“fscanf(write_msg[BUFFER_SIZE])”不会超过它吗?问题#3:你到底想在你的循环中完成什么?读一个字符?读取字符串?读一行?你如何控制正在阅读的内容?老实说,我认为你需要重新考虑你的逻辑。恕我直言...
  • 试图将一行读入数组

标签: c arrays file file-upload segmentation-fault


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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 并引发分段错误。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-14
        • 2015-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-04
        相关资源
        最近更新 更多