2014-02-01 3 views
-2

Я хочу читать в текстовый файл, который имеет следующий формат:Чтение в строке за строкой в ​​c?

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

Я хочу, чтобы выяснить, что лучший выбор видеоигр между п число людей, является создание системы голосования. Первый int - количество игр. Затем есть 3 линии с именами видеоигр. Тогда есть int, представляющий число людей, а затем их имена, за которыми следует их ранжирование предпочтений в играх.

Мне нужна помощь при запуске этой программы. Любой совет?

+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

Что такое '' header? Это не стандарт C. Что такое 'fgetln()'? Это тоже не стандарт C? Похоже, что 'fgetln()' возвращает указатель - это новый указатель для каждой строки? Если это так, у вас есть утечка памяти. Если нет, возможно, вам нужно скопировать строку где-нибудь, если вам нужно сохранить значение (содержимое строки) на нескольких вызовах (и вам лучше не использовать его в потоковой программе, а функции, которые вы вызываете, лучше не использовать его и ...). –

+0

fgetln() и err() доступны в BSD-системах, а также в mac –

+0

Hmmm ... [''] (http://man7.org/linux/man-pages/man3/err.3.html) является справочной страницей Linux, в которой отмечается, что 'err.h' является нестандартным расширением BSD. ['fgetln()'] (http://www.freebsd.org/cgi/man.cgi?query=fgetln&sektion=3) - это функция BSD ... как вы отметили ... вам нужно быть осторожным, чтобы определить нестандартную функциональность потому что удручающе вероятно, что OP работает на Windows, бедняжка. –

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; 
} 
Смежные вопросы