0

我需要在文本文件中存储两个整数,然后是文本行。我通过将每个 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);

我尝试了几种不同的方法,但它们从未奏效。我知道我可以读取字符串之类的东西,gets 或其他东西,但我认为如果字符串包含空格,就会出现问题。我想知道我正在做的方式是否是最好的,以及它有什么问题。我发现其中一种方法(也不起作用)你必须通过每行的最大长度。如有必要,我知道此信息,这是我之前阅读的 maxCol。

4

3 回答 3

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

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

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

(格式中的'\n'和之间没有区别。两者都消耗扫描 int 的非空白字符字符串之后的整个空白。)' 'fscanflna

于 2012-11-19T14:38:38.817 回答
1

您需要先为 lna 分配空间。

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

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

于 2012-11-19T14:37:43.057 回答
1

您似乎期望fscanf()为您动态分配字符串;这根本不是它的工作原理。这是未定义的行为。

于 2012-11-19T14:38:05.487 回答