使用fgets和strtok在C中读取文件?

时间:2017-06-17 15:16:53

标签: c pointers fgets strtok

我目前正在为学校写一个小程序,我们必须使用fgets和strtok来读取文件。

input.txt is:
Redden 2 0
Berglund 5 2
Jackman 2 0
Stewart 4 0
Oshie 3 5
McDonald 2 4

以下是相关代码

int main(int arg, char *argv[]) {
    FILE *fp=fopen(argv[1]);
    char **names=NULL;
    int *goals=NULL;
    int *assists=NULL;
    int size = countLinesInFile(fp);
    allocateMemory(&goals, &assists, &names, size);
    readLines(fp, goals, assists, names, size);
}

void allocateMemory(int** goals, int** assists, char*** names, int size) {
    *goals = malloc(size*sizeof(int));
    *assists = malloc(size*sizeof(int));
    *names = malloc(size*sizeof(char *));
    int i;
    for(i=0; i<size; i++)
    {
       *(*names + i) = malloc(MAX_NAME*sizeof(char));
    }
}

void readLines(FILE *ptr, int *goals, int *assists, char **names, int size) {
    char *line=malloc(MAX_LINE*sizeof(char));
    int i;
    char *token=NULL;
    for(i=0;i<size;i++) {
        if(fgets(line,MAX_LINE, ptr)!=NULL); {
            token=strtok(line,"");//segfaulting somewhere around these lines
            strcpy(names[i],token);
            token=strtok(NULL,"\n");
            goals[i]=atoi(token);
            token=strtok(NULL,"\n");
            assists[i]=atoi(token);
        }
    }
    free(line);
}

所以我是segfaulting,它告诉我它发生在readLines函数中,并且不知道如何解决这个问题。任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:2)

一个问题是对undefined的调用。您的文件使用空格作为分隔符,因此您应该这样做:

strtok

请注意,第三个标记将包含 if(fgets(line,MAX_LINE, ptr)!=NULL); { token=strtok(line," "); strcpy(names[i],token); token=strtok(NULL," "); goals[i]=atoi(token); token=strtok(NULL," "); assists[i]=atoi(token); } 个字符。 \n会忽略\n。如果您希望从返回的令牌中删除它,请将atoi替换为" \n"的最后一个参数。