C - fscanf读取两个整数然后读取字符串

时间:2012-11-19 14:35:24

标签: c file io scanf

我需要在文本文件中存储两个整数,然后存储文本行。我已经成功完成了它,通过在一行中写入每个int,并在新行中写入文本的每一行。然而,为了阅读它,我发现了一些麻烦。我这样做:

FILE *f = fopen(arquivo, "r");
char *lna = NULL;
fscanf(f, "%d\n%d\n", &maxCol, &maxLin);
//↑This reads the two ints, works fine in step-by-step
for (;;) {
    fscanf(f, "%s\n", &lna);
    //↑This sets lna to NULL always, even if there are more lines
    if (lna != NULL)
        lna[strlen(lna) - 1] = '\0';
    if (feof(f))
        break;
    inserirApos(lista, lna, &atual);
}
fclose(f);

我尝试了几种不同的方式,但它们从未奏效。我知道我可以阅读像字符串一样的东西,有些东西,但我认为如果字符串包含空格则会有问题。我想知道我做的方式是否最好,以及它有什么问题。我发现其中一种方法(也没用),你必须传递每行的最大长度。如果有必要,我知道这些信息,这是我之前读过的maxCol。

3 个答案:

答案 0 :(得分:2)

fscanf(f, "%s\n", &lna);

是错误的参数类型。 %s格式需要char*作为参数,但您给它char**。而且你还没有为那个指针分配内存。 fscanf期望char*指向足够大的内存区域。

char *lna = malloc(whatever_you_need);
...
    fscanf("%s ", lna);

'\n'格式中的' 'fscanf之间没有区别。两者都使用了扫描int lna的非空白字符串后面的整个空格。)

答案 1 :(得分:1)

您需要先为lna分配空间。

char *lna = malloc(MAX_SIZE);//MAX_SIZE is the maximum size the string can be + 1 

附加参数应该指向已经分配的格式字符串中由其相应格式说明符指定的类型的对象。

答案 2 :(得分:1)

您好像期待fscanf()为您动态分配字符串;这根本不是它的运作方式。这是未定义的行为。