user-0 提问: C语言 显示功能小问题

回复:
user: user-0
content: 解决了，是文件读取问题，谢了

user: user-0
content: 引用 7 楼 cfjtaishan 的回复:[quote=引用 6 楼 qiangshu6990 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] 改一下create函数里这句： fscanf(fp, "%s%s%d", stu[j].id, stu[j].name, &stu[j].balance); 改成  fscanf(fp, "%s%s%d\n", stu[j].id, stu[j].name, &stu[j].balance); 加一个'\n'，因为看到你的每次写入都加了'\n'，所以读取时，也要加上。这样做到格式统一 嗯，改了之后就解决了，谢谢！不过现在出现续钱后就会消失某个档案，求解[/quote] 消失那个档案，最后一个还是中间某个？可以先确认一下文件里是否有该档案，如果有，那么应该是读文件时出现的问题，可以单读查文件[/quote] 我建立六个档案，帮第二个续钱，结果第二，第四，第六都没了，我再帮第一个续，第三个又没了

user: user-1
content: 改一下create函数里这句： fscanf(fp, "%s%s%d", stu[j].id, stu[j].name, &stu[j].balance); 改成  fscanf(fp, "%s%s%d\n", stu[j].id, stu[j].name, &stu[j].balance); 加一个'\n'，因为看到你的每次写入都加了'\n'，所以读取时，也要加上。这样做到格式统一

user: user-2
content: 打印结构体，最好用fread和fwrite函数，可以参考一下这个资料 http://blog.csdn.net/libing403?viewmode=contents

user: user-1
content: 引用 6 楼 qiangshu6990 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] 改一下create函数里这句： fscanf(fp, "%s%s%d", stu[j].id, stu[j].name, &stu[j].balance); 改成  fscanf(fp, "%s%s%d\n", stu[j].id, stu[j].name, &stu[j].balance); 加一个'\n'，因为看到你的每次写入都加了'\n'，所以读取时，也要加上。这样做到格式统一 嗯，改了之后就解决了，谢谢！不过现在出现续钱后就会消失某个档案，求解[/quote] 消失那个档案，最后一个还是中间某个？可以先确认一下文件里是否有该档案，如果有，那么应该是读文件时出现的问题，可以单读查文件

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:改一下create函数里这句： fscanf(fp, "%s%s%d", stu[j].id, stu[j].name, &stu[j].balance); 改成  fscanf(fp, "%s%s%d\n", stu[j].id, stu[j].name, &stu[j].balance); 加一个'\n'，因为看到你的每次写入都加了'\n'，所以读取时，也要加上。这样做到格式统一 嗯，改了之后就解决了，谢谢！不过现在出现续钱后就会消失某个档案，求解

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:在create函数里为什么有两个fscanf，while(!feof(fp))和for里都有fscanf，理论上while(!feof(fp))退出循环就已经读到文件末尾了吧 之前改的时候忘记注释，不过现在改了还是不行 void Create()   //创新功能——显示所有学生信息 {     struct Student stu[150] = {0};     int j = 0;     char ch;     if((fp = fopen("duli16.3.dat", "a+")) == NULL)     {         printf("打开文件失败！\n");         exit(0);     }     while(!feof(fp))     {         fscanf(fp, "%s%s%d", stu[j].id, stu[j].name, &stu[j].balance);         j++;     }      printf("学号\t\t\t名字\t\t\t余额\n");     for(int i = 0; i < j; i++)     {         //fscanf(fp, "%15s%15s%10d", stu[i].id, stu[i].name, stu[i].balance);         //printf("%15s%15s%10d\n", stu[i].id, stu[i].name, stu[i].balance);         printf("%s\t\t\t", stu[i].id);         printf("%s\t\t\t", stu[i].name);         printf("%d\n", stu[i].balance);     }     //while((ch = fgetc(fp)) != EOF)         //printf("%c",ch);      fclose(fp);     system("pause");     system("cls"); }

user: user-1
content: 在create函数里为什么有两个fscanf，while(!feof(fp))和for里都有fscanf，理论上while(!feof(fp))退出循环就已经读到文件末尾了吧

user: user-0
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h>  struct Student {     char id[15];     char name[10];     int balance;   //余额 }stu; time_t start, end; FILE *fp;  void Build()   //建立上机档案 {     struct Student stu = {0};     int i = 1;      if((fp=fopen("duli16.3.dat", "a+")) == NULL)     {         printf("打开文件失败！\n");         exit(0);     }     while(i == 1)     {         printf("请输入学号：");         scanf("%s", stu.id);         printf("姓名：");         scanf("%s", stu.name);         printf("金额：");         scanf("%d", &stu.balance);         fprintf(fp, "%15s%15s%10d\n", stu.id, stu.name, stu.balance);         printf("是否继续？（1-是   2-否）\n");         scanf("%d", &i);     }     fclose(fp);     system("pause");     system("cls"); } void Online()   //开始上机 {     struct Student stu[150] = {0};     char s[15];     int i, j, k;     k = -1;     i = j = 0;      if((fp = fopen("duli16.3.dat", "r")) == NULL)     {         printf("打开文件失败！\n");         exit(0);     }     while(!feof(fp))     {         fscanf(fp, "%s%s%d", stu[j].id, stu[j].name, &stu[j].balance);         j++;     }     fclose(fp);      printf("请输入上机学生学号：");     scanf("%s", s);     for(i = 0; i <= j; i++)     {         if(strcmp(stu[i].id, s) == 0)         {             k = i;             break;         }     }     if(k == -1)     {         printf("查无此人，请重新输入！\n");         Online();     }     if(stu[i].balance < 6)         printf("余额不够，请续钱！\n");     else     {         start = time(NULL);         printf("学号：%15s     姓名：%15s     余额：%15d\n", stu[i].id, stu[i].name, stu[i].balance);     }     system("pause");     system("cls"); } void Offline()   //离开机房 {     struct Student stu[150] = {0};     int dif, hour, minute, second, money, j, k, i = 0;     char s[15];     end = time(NULL);     dif = (int) difftime(end, start);     hour = dif / 3600;     minute = dif%3600 / 60;     second = dif % 60;      if(minute > 30)         hour++;     else if(minute > 0)         minute = 1;     money = hour*2 + minute;      fopen("duli16.3.dat", "r");     while(!feof(fp))     {         fscanf(fp, "%s%s%d", stu[i].id, stu[i].name, &stu[i].balance);         i++;     }     printf("请输入下机学生学号：");     scanf("%s", s);     for(k = 0; k <= i; k++)         if(strcmp(stu[k].id, s) == 0)             break;     fclose(fp);     j = stu[k].balance;     stu[k].balance -= money;     printf("上机前的金额：%d     上机后的金额：%d\n", j, stu[k].balance);      fp = fopen("duli16.3.dat", "a+");     for(k = 0; k < i; k++)         fprintf(fp, "%15s%15s%10d\n", stu[k].id, stu[k].name, stu[k].balance);     fclose(fp);     system("pause");     system("cls"); } void Add()   //添加新档案 {     struct Student stu[150] = {0};     int j = 0;      if((fp = fopen("duli16.3.dat", "a+")) == NULL)     {         printf("打开文件失败！\n");         exit(0);     }     while(!feof(fp))     {         fscanf(fp, "%s%s%d", stu[j].id, stu[j].name, &stu[j].balance);         j++;     }      printf("请输入学号：");     scanf("%s", stu[j+1].id);     for(int i = 0; i <= j; i++)     {         if(strcmp(stu[i].id, stu[j+1].id) == 0)         {             printf("该学号已存在，请重新输入！\n");             Add();         }     }     printf("姓名：");     scanf("%s", stu[j+1].name);     printf("金额：");     scanf("%d", &stu[j+1].balance);     fprintf(fp, "%15s%15s%10d\n", stu[j+1].id, stu[j+1].name, stu[j+1].balance);     fclose(fp);     system("pause");     system("cls"); } void Logout()   //注销旧档案 {     struct Student stu[150] = {0};     int j, i, l, flag;     char s[15];     j = flag = 0;      if((fp = fopen("duli16.3.dat", "a+")) == NULL)     {         printf("打开文件失败！\n");         exit(0);     }     while(!feof(fp))     {         fscanf(fp, "%s%s%d", stu[j].id, stu[j].name, &stu[j].balance);         j++;     }     fclose(fp);      printf("请输入要注销的学号：");     scanf("%s", s);     printf("确认注销此学号？（1-确认 2-重新输入）\n");     scanf("%d", &l);     if(l == 2)         Logout();     else     {         for(i = 0; i < j; i++)             if(strcmp(stu[i].id, s) == 0)                 break;         for(; i < j; i++)             stu[i] = stu[i+1];          fp = fopen("duli16.3.dat", "w");         for(i = 0; i < j-1; i++)             fprintf(fp, "%15s%15s%10d\n", stu[i].id, stu[i].name, stu[i].balance);         fclose(fp);         system("pause");         system("cls");     } } void Renew()   //续钱 {     struct Student stu[150] = {0};     int money, flag, k, j, i;     char s[15];     flag = -1;     j = 0;      if((fp = fopen("duli16.3.dat", "a+")) == NULL)     {         printf("打开文件失败！\n");         exit(0);     }     while(!feof(fp))     {         fscanf(fp, "%s%s%d", stu[j].id, stu[j].name, &stu[j].balance);         j++;     }     fclose(fp);      printf("请输入学号：");     scanf("%s", s);     printf("续钱额：");     scanf("%d", &money);     for(i = 0; i <= j; i++)     {         if(strcmp(stu[i].id ,s) == 0)         {             k = stu[i].balance + money;             flag++;             printf("续钱成功！续钱前金额：%d     续钱后金额：%d\n", stu[i].balance, k);             stu[i].balance = k;             break;         }     }     if(flag == -1)     {         printf("查无此人，请重新输入！\n");         Renew();     }      fp = fopen("duli16.3.dat", "w");     for(int i = 0; i < j; i++)     {         fprintf(fp, "%15s%15s%10d\n", stu[i].id, stu[i].name, stu[i].balance);         i++;     }     fclose(fp);     system("pause");     system("cls"); } void Create()   //创新功能——显示所有学生信息 {     struct Student stu[150] = {0};     int j = 0;     char ch;     if((fp = fopen("duli16.3.dat", "a+")) == NULL)     {         printf("打开文件失败！\n");         exit(0);     }     while(!feof(fp))     {         fscanf(fp, "%s%s%d", stu[j].id, stu[j].name, &stu[j].balance);         j++;     }      //printf("学号\t\t\t名字\t\t\t余额\n");     for(int i = 0; i < j; i++)     {         fscanf(fp, "%15s%15s%10d", stu[i].id, stu[i].name, stu[i].balance);         printf("%15s%15s%10d\n", stu[i].id, stu[i].name, stu[i].balance);         //printf("%s\t\t\t", stu[i].id);         //printf("%s\t\t\t", stu[i].name);         //printf("%d\n", stu[i].balance);     }     //while((ch = fgetc(fp)) != EOF)         //printf("%c",ch);      fclose(fp);     system("pause");     system("cls"); } int main() {     int i;     while(1)     {         printf("…………………………………………………….\n");         printf(".请输入选项编号（0~7）：\n");         printf(". 1——建立上机档案.\n");         printf(". 2——开始上机.\n");         printf(". 3——离开机房.\n");         printf(". 4——添加新档案.\n");         printf(". 5——注销旧档案.\n");         printf(". 6——续钱.\n");         printf(". 7——创新功能.\n");         printf(". 0——退出系统.\n");         printf("…………………………………………………….\n");         scanf("%d", &i);          switch(i)         {             case 1:                 Build();                 break;             case 2:                 Online();                 break;             case 3:                 Offline();                 break;             case 4:                 Add();                 break;             case 5:                 Logout();                 break;             case 6:                 Renew();                 break;             case 7:                 Create();                 break;             case 0:                 printf("感谢使用本软件！已成功退出，按任意键结束。\n");                 exit(0);             default:                 ;         }     } }