为什么文件里的数据读不出来?

新手上路,请多包涵

问题是下面语句从文件中读取不了数据。

fscanf(fp,"%d%s%s%d%d%d%f%d",&cla[i].num,cla[i].name,cla[i].nature,&cla[i].toperiod,&cla[i].giperiod,&cla[i].experiod,&cla[i].credit,&cla[i].term);
void listcourse(){//要改 
    int i,n,count=0,j;
    FILE *fp;
    struct Course cla[100];
    color(10);
    if((fp=fopen("d:\\UserDate\\Cpp\\course.txt", "r"))==NULL)    {printf("无法打开此文件\n");exit(0);}
    for(i=0;!(feof(fp));i++){        
        fscanf(fp,"%d%s%s%d%d%d%f%d",&cla[i].num,cla[i].name,cla[i].nature,&cla[i].toperiod,&cla[i].giperiod,&cla[i].experiod,&cla[i].credit,&cla[i].term);
        count++;
        printf("%d",count);
        printf("lllll");//没有打印,文件数据读不出来 
    }
    for(j=0;j<count;j++)
    {
        printf("课程编号:%07d 名称:%s 性质:%s 总学时:%d 授课学时:%d 实验或上机学时:%d 学分:%.2f 上课学期:%d\n",cla[j].num,cla[j].name,cla[j].nature,cla[j].toperiod,cla[j].giperiod,cla[j].experiod,cla[j].credit,cla[j].term);
        if((j+1)%10==0)                    //判断输出是否达到10条记录
        {
            printf("每页显示10条课程记录,按回车键向后翻页......\n");
            getchar();
            system("cls");
        }
    }
    
    fclose(fp);
    color(10);
    printf("请选择1.返回主界面2.退出\n");
    scanf("%d",&n);
    switch(n){
    case 1:system("cls");welcome();break;
    case 2:exit(0);break;}
}

文件里的内容是
1 数据库 专业课 48 40 8 5.00 1
2 c语言 专业课 30 15 15 6.00 2
3 python 专业课 30 15 15 5.00 1
4 java 专业课 46 23 23 6.00 2
5 云计算 专业课 20 10 10 4.00 3
6 ps 选修课 10 5 5 1.00 1
7 数学 必修课 20 10 10 3.00 1
8 英语 必修课 20 10 10 3.00 2
9 电子 专业课 30 20 10 4.00 2
10 水彩画 选修课 10 5 5 2.00 3

结构体为

struct Course//课程
{ int num;//课程编号
  char name[50];//课程名称
  char nature[50];//课程性质
  int toperiod;//课程总学时
  int giperiod;//课程授课学时
  int experiod;//课程上机或实验学时
  float credit;//课程学分
  int term;//课程学期
};

确定文件文件命名正确。
打印结果为image.png

阅读 1.3k
2 个回答

根据代码,读文件是没有问题的,,,,估计你的路径、或文件不正确

问题可能出在文件读取格式和实际文件内容格式不匹配上。在您的文件内容中,每一行数据之间的字段是用空格分隔的,而在fscanf函数中,字符串%s会连续读取直到遇到空格为止。因此,对于包含空格的name和nature字段,应该用更精确的方式来读取整个字符串。
您可以尝试修改fscanf的格式字符串来适应文件内容的格式,如下所示:

fscanf(fp, "%d %[^\n] %[^ \n] %d %d %d %f %d",
       &cla[i].num, cla[i].name, cla[i].nature,
       &cla[i].toperiod, &cla[i].giperiod, &cla[i].experiod,
       &cla[i].credit, &cla[i].term);

这里使用%[^\n]表示读取直到遇到换行符的所有字符,而%[^ \n]则表示读取直到遇到空格或换行符的所有非空格字符。这样可以确保整行数据被正确解析。
同时,请注意在读取文件末尾时,由于最后一行后面没有换行符,可能也会导致读取问题。在循环条件中,建议采用以下形式进行改进以防止潜在的错误:

for (i = 0; i < 100 && !feof(fp) && fscanf(fp, ...); i++) { ... }

这样一来,只有当成功读取一行数据时才会进行下一次循环,从而避免因feof()检测不准确造成的无效数据读取问题

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进