我有一个编程任务,提供一个数据文件“candidatesdata.txt” 您应该阅读信息并解读名称,性别,身高和体重。唯一的问题是每个数据记录之间的名称和逗号都有引号。该文件如下:
Name,Gender,Height,Weight
"Tanner, Mark C.”,M,71.8,180.25
"Jinglehiemmerschmitt, John J.”,M,70.75,185.3
"Parker, Sarah J.",F,65.25,120.3
..续
如何阅读数据记录并忽略引号和逗号? 这是我到目前为止,它删除了一些逗号和引号,但在删除名称的过程中。
#include <stdio.h>
struct candidateinfo
{
char name[50];
char gender;
double height;
double weight;
}candidate;
int main()
{
int count =0;
FILE *candidate_data;
// Open file
candidate_data = fopen("/Users/moisestrevino/Documents/CS 1324/Assignment #5/Assignment #5/candidatedata.txt","r");
fscanf(candidate_data, "%*[^\n]");
fgetc(candidate_data);
// Get rid of unecessary letters
while (count<40)
{
count++;
fscanf(candidate_data,"\"%[^\"],%c,%lf,%lf\n", candidate.name, &candidate.gender, &candidate.height, &candidate.weight);
printf("%s %c %lf %lf\n",candidate.name, candidate.gender, candidate.height, candidate.weight);
}
fclose(candidate_data);
return 0;
}
输出:
Tanner, Mark C. 0.000000 0.000000
,M,71.8,180.25
0.000000 0.000000
Jinglehiemmerschmitt, John J. 0.000000 0.000000
,M,70.75,185.3
0.000000 0.000000
Parker, Sarah J. 0.000000 0.000000
,F,65.25,120.3
0.000000 0.000000
Meeks, Kalvin R. 0.000000 0.000000
,M,57.25,210.2
cont...
答案 0 :(得分:0)
您的代码包含许多问题。有太多要提,所以这里有修复:
如果文件包含以下格式的数据:
Name,Gender,Height,Weight
然后,
"Tanner, Mark C.",M,71.8,180.25
"Jinglehiemmerschmitt, John J.",M,70.75,185.3
"Parker, Sarah J.",F,65.25,120.3
然后下面的修复将会解决。
在fopen
之后,您可以使用
fscanf(candidate_data, "%*[^\n]");
fgetc(candidate_data);
第一行扫描并丢弃所有内容,直到换行符。第二行使用换行符。在此之后,使用
fscanf(candidate_data, " \"%[^\"]\",%c,%lf,%lf", name, gender, height, weight);
假设您已经声明了一个名为char
的{{1}}数量相当大的数组,名称为name
的{{1}}和名称char
gender
1}}和double
,以下是上述height
的细分:
weight
(空格)扫描并丢弃所有空白字符,直到第一个非空白字符。fscanf
扫描文件中的
并将其丢弃。\"
扫描所有内容,直到"
并将其存储在%[^\"]
。"
扫描文件中的name
并将其丢弃。\"
扫描并丢弃逗号。"
扫描角色并将其存储在,
。%c
扫描并丢弃逗号。gender
扫描,
并将其存储在%lf
。double
扫描并丢弃逗号。height
扫描,
并将其存储在%lf
。现在您可以打印每个值。通过将上面的double
置于循环中来阅读更多数据。
但是你怎么知道数据何时结束?检查weight
的返回值。 fscanf
返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。
在您的情况下,如果成功扫描了所有数据,fscanf
将返回4。所以,只需阅读数据,直到fscanf
没有返回4。
来防止缓冲区溢出
fscanf
49告诉fscanf
扫描fscanf(candidate_data, " \"%49[^\"]\",%c,%lf,%lf", name, gender, height, weight);
最多49个字符(NUL终止符为+ 1)
答案 1 :(得分:0)
如果每一行包含所有字段,则可以改为使用str(r)chr + atof,例如
char line[100];
while( fgets(line,100,candidate_data) )
{
char *p = strrchr(line,',');
weight = atof(p+1); *p=0;
p = strrchr(line,',');
height = atof(p+1);
gender = *--p;
*strrchr(line,'"')=0;
strcpy( name, strchr(line,'"')+1 );
}