如何从C中读取文件中的数据?

时间:2012-03-31 02:12:56

标签: c string

我有一个包含信息的文件

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,依此类推?

3 个答案:

答案 0 :(得分:2)

您可以修改fscanf()格式字符串。

if (fscanf(read, "%lf:%19[^:]:%19[^:]:%d:%lf", &num, lastn, firstn, &group, &hours) != 5)
    ...the read failed...

符号%19[^:]表示“在字符串中读取最多19个非冒号字符”,后跟空值。请注意,变量lastnfirstnchar[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