在c中逐行阅读?

时间:2014-02-01 21:09:54

标签: c

我想阅读具有以下格式的文本文件:

3
COD
Halo
Madden
2
Tom Jones 1 3 2
Bill Ray 3 2 1
........

我想通过创建投票系统来弄清楚n个人之间的顶级视频游戏选择。 第一个int是游戏数量。然后有3行视频游戏名称。然后有一个代表人数的int,然后是他们的名字,然后是他们对游戏的偏好排名。

我需要帮助开始这个计划。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

参见下面的例子,它应该让你开始,它将从输入文件中读取每一行,你可以为每一行做任何你需要的事情:

#include <err.h>    
#include <stdio.h>

int
main()
{
    FILE *f;
    size_t len;
    char *line;

    f = fopen("inputfile.txt", "r");
    if (f == NULL)
        return 0;

    while (line = fgetln(f, &len)) {
                /*DO whatever you need to do for each line here.*/
        fwrite(line, len, 1, stdout);
    }
    if (!feof(f))
        err(1, "fgetln");

    return 0;
}

答案 1 :(得分:0)

像这样的样本

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>

typedef struct player {
    char *name;
    int  *rank;
} Player;

int main(){
    FILE *fp;
    if(NULL==(fp=fopen("data.txt", "r"))){
        perror("file open");
        return -1;
    }
    //read name of game
    int numOfGame;
    fscanf(fp, "%d", &numOfGame);
    char gameName[numOfGame][64];
    int i;
    for(i=0;i<numOfGame;++i){
        fscanf(fp, "%63s", gameName[i]);
    }
    //read gamer 
    int numOfGamer;
    fscanf(fp, "%d%*c", &numOfGamer);
    Player players[numOfGamer];
    char line_buf[128];
    int j;
    for(i=0;i<numOfGamer;++i){
        fgets(line_buf, sizeof(line_buf), fp);
        char *p = strchr(line_buf, ' ');
        p = strchr(p+1, ' ');//second space
        *p = '\0';
        players[i].name = strdup(line_buf);
        players[i].rank = calloc(numOfGamer, sizeof(int));
        for(j = 0;j<numOfGame;++j){
            sscanf(++p, "%d", &players[i].rank[j]);
            p = strchr(p + 1, ' ');
        }
    }
    fclose(fp);
    //test print
    printf("name\t\t");
    for(i=0;i<numOfGame;++i){
        printf("%s\t", gameName[i]);
    }
    printf("\n");
    for(i=0;i<numOfGamer;++i){
        printf("%s\t", players[i].name);
        for(j = 0;j<numOfGame;++j){
            printf("%d\t", players[i].rank[j]);
        }
        printf("\n");
    }

    //release
    for(i=0;i<numOfGamer;++i){
        free(players[i].name);
        free(players[i].rank);
    }
    return 0;
}