解析txt文件

时间:2013-10-11 06:01:22

标签: c parsing scanf

我正在尝试解析包含以下格式的名称的txt文件:

"MARY","PATRICIA","LINDA","BARBARA","ELIZABETH",...

这是我写的代码:


#include <stdio.h>
// Names scores
int problem22() {
    FILE *f = fopen("names.txt", "r");
    char name[100];
    fscanf(f, "\"%[^\"]s", name);
    printf("%s\n", name); // MARY
    fscanf(f, "\"%[^\"]s", name);
    printf("%s\n", name); // ,
    fscanf(f, "\"%[^\"]s", name);
    printf("%s\n", name); // PATRICIA
    return 0;
}

int main() {
    problem22();
    return 0;
}

每个对fscanf的替代调用都会给我一个名字,而另一个则会在获取逗号时浪费。我尝试了几种格式,但我无法弄清楚如何做到这一点。

任何人都可以用正确的格式帮助我吗?

4 个答案:

答案 0 :(得分:3)

我总是喜欢使用strtok()strtok_r()函数来解析文件。 (或者更喜欢使用一些csv库)。

但是为了好玩,我写了一个代码可能你喜欢它,我不是在我的答案中发布代码但是检查@ codepad输出,仅适用于特定格式。

使用strtok()

正确的方法在我看来如下:

int main(){
// while(fp, csv, sizeof(csv)){   
    // First read into a part of file  into buffer
    char csv[] = "\"MARY\",\"PATRICIA\",\"LINDA\",\"BARBARA\",\"ELIZABETH\"";
    char *name = "", 
       *parse = csv;
    while(name = strtok(parse, "\",")){
        printf(" %s\n", name);
        parse = NULL;
    }
    return 0;
} // end while 

检查codepade输出:

 MARY
 PATRICIA
 LINDA
 BARBARA
 ELIZABETH

我建议在第二个代码中绘制一个外部循环来读取从文件到临时缓冲区的行,然后应用如上所述的strtok()代码:while(fgets(fp, csv, sizeof(csv))){ use strtok code}

答案 1 :(得分:3)

将输入格式字符串更改为"%*[,\"]%[^\"]"可以达到您想要的效果:

fscanf(f, "%*[,\"]%[^\"]", name);
printf("%s\n", name); // MARY
fscanf(f, "%*[,\"]%[^\"]", name);
printf("%s\n", name); // PATRICIA
fscanf(f, "%*[,\"]%[^\"]", name);
printf("%s\n", name); // LINDA

%*只是跳过匹配的输入。

答案 2 :(得分:2)

你必须使用 fseek()

此代码成功运作:

#include <stdio.h>
#include <string.h>

int problem22()
{
    FILE *f = fopen("names.txt", "r");
    char name[100];
    int pos = 0, maxnames = 4, n;

    for(n = 0; n <= maxnames; n++)
    {
        fseek(f, pos, 0);
        fscanf(f, "\"%[^\"]s", name);
        printf("%s\n", name);
        pos += (strlen(name) + 3);
    }
    return 0;
}

int main()
{
    problem22();
    return 0;
}

答案 3 :(得分:1)

您可以使用strtok() 读取整行并使用delin字符串","

将其拆分为标记
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Names scores
int problem22() {
    FILE *f = fopen("file", "r");
    char *tok=NULL;
    char name[100];
    fscanf(f,"%s",name);

    printf("string before strtok(): %s\n", name);
    tok =  strtok(name, ",");
    while (tok) {
        printf("Token: %s\n", tok);
        tok = strtok(NULL, ",");
    }


return 0;
}

int main() {
    problem22();
    return 0;
}

注意:strtok()函数在解析时使用静态缓冲区,因此它不是线程安全的。如果这对您很重要,请使用strtok_r()

请参阅man strtok_r