用C代码解析.text文件

时间:2012-07-01 14:31:01

标签: c parsing scanf

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

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

在C代码中使用fscanf。 我在fscanf调用中尝试了一些格式,但它们都没有工作......

编辑:

  

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

这是我第一次尝试; fscanf()不得捕捉模式'autore','titolo','editore'等。

2 个答案:

答案 0 :(得分:2)

一般来说,尝试使用fscanf解析输入并不是一个好主意,因为如果输入与预期不匹配,则难以优雅地恢复。通常最好将输入读入内部缓冲区(使用freadfgets),并在那里解析(使用sscanfstrtokstrtol等等。)。有关哪些函数最佳的详细信息取决于输入格式的定义(您没有给我们提供;示例输入是 no 替换正式规范)。

答案 1 :(得分: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);
}

此处,格式字符串包含以下内容:

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

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