C语言 如何从文件中读取并将其写入结构中?我的代码有点问题

snz8szmq  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(126)

我必须写这段代码,我的意思是我应该从文件中读取学生的名字和他们的分数,然后根据分数的增长对学生进行排序。现在我只想输出分数。我想用结构显示成绩。我不知道问题出在哪里。
第一个

nhhxz33t

nhhxz33t1#

  • 如果打开文件失败,您需要防止程序从文件指针阅读:
ptr = fopen("test.txt", "r");
if (NULL == ptr) {
    perror("test.txt");
    return 1;               // this could be one way
}
  • strok的第二个参数应该是以空值终止的字符串。const char s[1] = " ";只能容纳 * 一个 * 字符。没有空值终止符(\0)。请将其设置为:
const char s[] = " "; // or const char s[2] = " "; or const char *s = " ";
  • 不要迭代越界。你需要检查一下,这样你就不会试图把数据放在PI1[N]
while (i < N && fgets(str, sizeof str, ptr) != NULL) {
//     ^^^^^^^^

  • 检查strok是否返回了指向新令牌的指针。如果没有,那么你读到的代码行不符合要求。
while (i < N && fgets(str, sizeof str, ptr) != NULL) {
    token = strtok(str, s);
    if(!token) break;               // token check
    strcpy(PI1[i].surname, token);
    token = strtok(NULL, s);
    if (token)                      // token check
        PI1[i].mark = atoi(token);
    else
        break;
    i++;
}
  • 你也可以跳过strcpy,直接阅读你的struct student,因为char str[50];surname的长度相同。str应该更大一些,但是现在:
while (i < N && fgets(PI1[i].surname, sizeof PI1[i].surname, ptr) != NULL) {
    token = strtok(PI1[i].surname, s);
    if(!token) break;
    token = strtok(NULL, s);
    if (token)
        PI1[i].mark = atoi(token);
    else
        break;
    i++;
}
  • 仅打印与成功读取
printf("The marks are:\n");
for(int idx = 0; idx < i; ++idx) {
    printf("%d ", PI1[idx].mark);
}
putchar('\n');

一样多的标记

相关问题