使用 fgets 和 strtok 读取 C 语言中的文件



我目前正在为学校编写一个小程序,我们必须使用 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);
}

所以我正在分段错误,它告诉我它发生在 readLines 函数中,不知道如何解决这个问题。任何帮助,不胜感激。谢谢!

一个问题是对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字符。atoi忽略n。如果要将其从返回的令牌中删除,请将最后一个参数替换为" n"strtok

最新更新