8

我正在尝试解析一个包含以下格式名称的 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

4 回答 4

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 

检查键盘的输出:

 MARY
 PATRICIA
 LINDA
 BARBARA
 ELIZABETH

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

于 2013-10-11T06:50:30.993 回答
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

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

于 2013-10-11T06:51:45.703 回答
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;
}
于 2013-10-11T06:41:09.487 回答
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

于 2013-10-11T06:32:49.347 回答