【问题标题】:Reading a line using fscanf()使用 fscanf() 读取一行
【发布时间】:2016-08-23 16:19:35
【问题描述】:

我正在尝试使用 fscanf() 从文件中读取一行:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    char c, *string[4];
    int i = 0,j[4];
    fp = fopen("boil.txt", "r");
    c = fgetc(fp);
    if(fp == NULL)
    { printf("File read error\n");
        exit(0);
    }

    while(c != '\n')
    {
        fscanf(fp, "%s %d ", string[i] , &j[i]);
        i++;
        c = fgetc(fp);
    }
    for(i = 0; i < 4; i++)
    {
        printf("%s      %d\n", string[i], j[i]);
    }
}

boil.txt 如下:

boil 4 boilmilk 3 boilwater 5 heat 10

为什么这个程序给出分段错误?

【问题讨论】:

  • 你需要分配内存,你的string[i]指针指向随机位置。
  • 这里也要小心,fgetc 和 fscanf 都将文件指针向前移动,你可能得不到你想要的字符。
  • 1) 没有错误检查 2) fgetc 返回 int,而不是 char,这是有充分理由的。 3) 没有分配空间。 4) 等 5) 见How to Ask
  • @crlanglois:我应该使用两个文件指针而不是一个吗?

标签: c segmentation-fault scanf


【解决方案1】:

因为您没有为此类字符串保留空间:

char *string[4];

是一个指向字符串的指针数组,但您需要空间来存储这些字符串,例如:

char temp[256];

fscanf(fp, "%s %d ", temp , &j[i]);
string[i] = strdup(temp);

编辑:

正如 iRove 所指出的,strdup 不是标准的一部分(但在许多实现中可用),如果您不能使用 strdup,则可以使用以下替代方法:

string[i] = malloc(strlen(temp) + 1);
if (string[i] == NULL) {
    perror("malloc");
    exit(EXIT_FAILURE);
}
strcpy(string[i], temp);

最后别忘了调用free(当字符串不再需要时)

for (i = 0; i < 4; i++) free(string[i]);

【讨论】:

  • 您必须记住,strdup() 实际上并不是 ISO C 标准的一部分。
  • 感谢您考虑到这一点。 :-)
  • 也谢谢你 ;)
  • @AlterMann:谢谢。我使用 malloc 分配了内存空间,但仍然出现分段错误。请你弄清楚为什么我现在遇到分段错误。另外,我没有长度上限的字符串。那么我应该如何实现它而不是使用 char temp[256]
  • 查看你的代码有几个问题 1)c = fgetc(fp);,在fopen之后:如果程序无法以读取模式打开文件,这可能会导致分段错误,请删除此行。 2)while(c != '\n'):如果您的文件不包含新行,这可能是一个问题,正确的方法是while (c != '\n' &amp;&amp; c != EOF)(您需要将c声明为int而不是char)3)不要混合fscanffgetc,我建议你看看fgetsstrtok 一起完成这个任务(使用空格作为分隔符)。试一试,如果遇到麻烦就回头。
猜你喜欢
  • 1970-01-01
  • 2017-12-05
  • 2017-12-04
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 2018-04-07
相关资源
最近更新 更多