首页 > 解决方案 > 在 C 中使用 fscanf 读取文件

问题描述

我有 c 代码在 while 循环中读取文件,将所有信息 fscanf 到 url、num 和 rank 变量中,然后将其打印出来。但是,输出不正确。

主要问题:

我有一个包含以下信息的文件:

url31, 3, 0.2623546
url21, 1, 0.1843112
url34, 6, 0.1576851
url22, 4, 0.1520093
url32, 6, 0.0925755
url23, 4, 0.0776758
url11, 3, 0.0733884 

这就是我得到的:

Link: url21,; Number: 1; Rank: 0.000000
Link: url34,; Number: 6; Rank: 0.000000
Link: url22,; Number: 4; Rank: 0.000000
Link: url32,; Number: 6; Rank: 0.000000
Link: url23,; Number: 4; Rank: 0.000000
Link: url11,; Number: 3; Rank: 0.000000
Link: url11,; Number: 3; Rank: 0.000000

预期输出:

Link: url31; Number: 3; Rank: 0.2623546
Link: url21; Number: 1; Rank: 0.1843112
Link: url34; Number: 6; Rank: 0.1576851
Link: url22; Number: 4; Rank: 0.1520093
Link: url32; Number: 6; Rank: 0.0925755
Link: url23; Number: 4; Rank: 0.0776758
Link: url11; Number: 3; Rank: 0.0733884

我的代码:

#define MAXSTR 1000

int main () {

    FILE *file;

    char url[10];
    int num;
    float rank;

    if ((file = fopen("pages.txt", "r")) == NULL) {
        printf("Error.\n");
        return -1;
    }

    while(fgets(lines, MAXSTR, file) != NULL) {

        fscanf(file, "%s %d %f", &url[0], &num, &rank);
        printf("Link: %s; Number: %d; Rank: %f\n", url, num, rank); 

    }
    return 0;
}    

标签: c

解决方案


fgets如果您已经在使用fscanf(只需继续扫描,直到找到一个),您也不需要EOF在 while 循环中使用。此外,您需要将 正确定义,为分隔符,否则第一个分隔符%s也会将逗号读入字符串。这个while循环有效:

while(fscanf(file, "%10[^,], %d, %f\n", url, &num, &rank) != EOF) {
    printf("Link: %s; Number: %d; Rank: %f\n", url, num, rank); 
}

我将分隔符定义为逗号,所以第一个字符串应该读取字符,直到遇到逗号%10[^,](读取格式说明符中提到的最多 10 个字符),然后是逗号、整数、逗号、浮点数,然后是换行符( \n)。

输出:

Link: url31; Number: 3; Rank: 0.262355
Link: url21; Number: 1; Rank: 0.184311
Link: url34; Number: 6; Rank: 0.157685
Link: url22; Number: 4; Rank: 0.152009
Link: url32; Number: 6; Rank: 0.092575
Link: url23; Number: 4; Rank: 0.077676
Link: url11; Number: 3; Rank: 0.073388

推荐阅读