1

我必须像这样解析一个 .txt 文件

autore: sempronio, caio; titolo: ; editore: ; luogo_pubblicazione: ; anno: 0; prestito: 0-1-1900; collocazione: ; descrizione_fisica: ; nota: ;

fscanfC 代码中。我在通话中尝试了一些格式fscanf,但它们都不起作用......

编辑:

a = fscanf(fp, "autore: %s");

这是我第一次尝试;'autore'、'titolo'、'editore' 等模式不能被fscanf().

4

2 回答 2

2

一般来说,尝试解析输入fscanf并不是一个好主意,因为如果输入不符合预期,就很难优雅地恢复。通常最好将输入读入内部缓冲区(使用freadfgets),然后在那里解析(使用sscanfstrtokstrtol)。关于哪些函数最好的细节取决于输入格式的定义(你没有给我们;示例输入不能替代正式规范)。

于 2012-07-01T14:36:46.473 回答
0

下面展示了如何使用strtok

char* item;
char* input; // fill it with fgets

for (item = strtok(input, ";"); item != NULL; item = strtok(NULL, ";"))
{
    // item loops through the following:
    // "autore: sempronio, caio"
    // " titolo: "
    // " editore: "
    // ...
}

下面展示了如何使用sscanf

char tag[20];
int chars = -1;

if (sscanf(item, " %19[^:]: %n", tag, &chars) == 1 && chars >= 0)
{
    printf("%s is %s\n", tag, item + chars);
}

在这里,格式字符串由以下内容组成:

  • (space) - 告诉解析器丢弃空格
  • 19 - 标签中的最大字节数/字符数
  • [^:] - 告诉解析器读取直到遇到冒号字符
  • : - 告诉解析器丢弃冒号字符
  • (空白) - 如上
  • %n - 告诉解析器报告它读取的字节数(检查 &chars)

如果有意外输入,字符数不会更新,因此您必须-1在解析每个项目之前将其设置为。

于 2012-07-01T16:23:35.803 回答