我有一个包含信息的文件
0001:Jack:Jeremy:6:38.0
0002:Mat:Steve:1:44.5
0003:Jessy:Rans:10:50.0
0004:Van Red:Jimmy:3:25.75
0005:Peter:John:8:42.25
0006:Mat:Jeff:3:62.0
我想从此文件中获取数据,因此该字符串的每个部分都将包含每个值。
例如,double num
将为3; char firstn[20]
将是'杰克',char lastn[20]
将是'杰里米',int t
将是6,double hour
将是38.0,依此类推。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *read, *write;
int i, group;
double hours, num;
char lastn[20],
firstn[20];
read = fopen("people.txt", "r");
if (read == NULL) {
printf("Error, Can not open the file\n");
exit(0);
}
write = fopen("people.dat", "w");
for (i=0; i<6; i++) {
fscanf(read, "%lf:%s:%s:%d:%lf", &num, lastn, firstn, &group, &hours);
fprintf(write, "Number: %lf Fname: %s Lastn: %s Group: %d Hours: %.1lf\n", num, lastn, firstn, group, hours);
}
fclose(read);
fclose(write);
return 0;
}
当我尝试这样做时,我的字符串lastn
会获取所有信息,直到行尾。
如何指定所以字符串firstn
只占用:
之前的字符,然后字符串lastn
只占用Jeremy,而group只占用6,依此类推?
答案 0 :(得分:2)
您可以修改fscanf()
格式字符串。
if (fscanf(read, "%lf:%19[^:]:%19[^:]:%d:%lf", &num, lastn, firstn, &group, &hours) != 5)
...the read failed...
符号%19[^:]
表示“在字符串中读取最多19个非冒号字符”,后跟空值。请注意,变量lastn
和firstn
为char[20]
。请注意,检查转换;如果你得到的答案不是5,那就出问题了。在fscanf()
调用后,您可以考虑将其余部分扫描到换行符:
int c;
while ((c = getc(read)) != EOF && c != '\n')
;
您还应该检查是否成功打开了输出文件。
答案 1 :(得分:1)
使用fgets()
读取行,然后使用strtok()
char line[100];
char *p;
fgets(line);
p = strtok(line, ":");
现在您可以根据需要将令牌存储到变量中。
答案 2 :(得分:1)
尝试:
fscanf(read, "%lf:%[^:]:%[^:]:%d:%lf", &num, lastn, firstn, &group, &hours);
%[^:]
表示读取不包含冒号的字符串。请参阅scanf。