0

从以下格式的文本文件:

Name Surname ID Address
Name Surname ID Address
Name Surname ID Address

我需要提取每一个并将其放入一个变量中。

我尝试了以下两种方法:

while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        &name2, &surname2, &id2, &address2);
}

这给了我错误的结果,它每行只读取一个单词,所以结果是这样的:

姓名:姓名 姓氏:@,身份证号:2272012 地址:?”
姓名:姓 姓:@,身份证:2272012 地址:?”
姓名:ID 姓氏:@,a ID:2272012 地址:?”
姓名:地址姓氏:@,ID:2272012 地址:?”

我使用的另一种方法是:

while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) == 4){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        &name2, &surname2, &id2, &address2);
}

什么也没读,什么也没发生。

我正在读取的文件是 .dat,它用于分配,因此只能使用 .dat。

4

4 回答 4

2

您声明您的文本文件采用以下格式:

string<space>string<space>numeric<space>string<newline>

如果这是准确的,您的格式字符串必须完全匹配:

strings
 |  |  numeric
 |  |  |  +-----string
 |  |  |  | +---newline
 V  V  V  V V
"%s %s %d %s\n"
   ^  ^  ^
   |  |  |
   spaces

这假设每个string字段都是一个 ASCII 值块,没有空格/制表符等。您的代码缺少变量的定义方式,大概是这样的:

char name2[100] = {0};
char surname2[100] = {0};
int id2 = 0;
char address2[100] = {0};

在这种情况下,您不需要在字符串&中将这些名称放在前面。fscanf所以给定一个输入文件:

首先是1234
someone@something.com 秒,但 22352 goo@gle.com
三是哈哈 9999 nice@lly.com

以及上面的变量声明,如下代码:

FILE * fp;
fp = fopen("test.txt", "r");
while(fscanf(fp, "%s %s %d %s\n", name2, surname2, &id2, address2) == 4) 
    printf("name: %s %s, id: %d, address %s\n", name2, surname2, id2, address2);

fclose(fp);

正确读取/显示值。

于 2013-01-07T16:04:10.213 回答
2
  • 格式字符串中不应该有逗号,除非数据中有逗号,但您没有显示。
  • 如果任何字段包含空格,这将不起作用,因为%s将停止。
  • 您需要显示更多输入 .dat 文件。
  • 使用 阅读整行通常会更好fgets()然后再担心解析它。
于 2013-01-07T15:45:23.487 回答
1

首先,&从变量中删除printf

printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        name2, surname2, id2, address2);

如果输入 txt 文件中字段之间的分隔符是逗号,

Name,Surname , ID ,Address
Name ,Surname,ID,Address
Name,Surname,ID,Address

然后在fscanf

while(fscanf(fp, " %[^, ] , %[^, ] , %d , %[^\n]", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        name2, surname2, id2, address2);
}

如果输入 txt 文件中字段之间的分隔符是空格

Name Surname ID Address
Name Surname ID Address
Name Surname ID Address

然后在fscanf

while(fscanf(fp, " %s %s %d %[^\n]", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        name2, surname2, id2, address2);
}
于 2013-01-07T15:46:03.003 回答
0
while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        &name2, &surname2, &id2, &address2);
}

我认为这是错误所在:

它应该是:

while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        name2, surname2, id2, address2);
}
于 2013-01-07T15:46:24.143 回答