鱼C论坛

 找回密码
 立即注册
查看: 613|回复: 5

[已解决]文件操作1

[复制链接]
发表于 2020-6-5 09:09:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <stdlib.h>
#define max 10
typedef struct student stu;
struct student
{
        char num[10];
        char name [20];
        int s1,s2,s3;
};

void Printmnue();
void readdata(FILE *fp,stu s[max],int *n);
void writedata(FILE *fp,stu[max],int n);


int main()
{
 
        int choice;
        int i,n;
        stu s[max];
        char yorn;
        FILE *fp;
        fp=fopen("学生信息.txt","r");
        if(fp==NULL)
        {
        printf("文件打开失败\n");
        exit (0);
        }                                              
        else 
                readdata(fp,s,&n);
        for(i=0;i<n;i++)
        {
         printf("%s %s %d %d %d\n",s[i].num ,s[i].name ,s[i].s1 ,s[i].s2 ,s[i].s3 );
         }
 fclose(fp);
 while (1)
 {        
        Printmnue();
   printf("请输入你的选择(1-7)\n");
  scanf("%d", &choice);
  switch (choice)
  {
     case 1:
            
     break;
     case 2:
      break;
     case 3:
      break;
     case 4:
      break;
     case 5:
      break;
     case 6:
      break;
     case 7:
     {
      exit(0);
         break;
     }
  }
     char YesOrNo;
     YesOrNo =getchar() ;
     if (YesOrNo == 'y' || YesOrNo == 'Y')
      continue;
     else 
      break;
 }
 system("pause");
  return 0;

}
void Printmnue()
{

 printf("1.添加学生数据\n");
 printf("2.删除数据\n");
 printf("3.排序\n");
 printf("4.成绩查询\n");
 printf("5.更改学生数据\n");
 printf("6.显示学生信息\n");
 printf("7.退出\n");
}


一个学生成绩系统的框架,学生信息数据已经在路径中提前保存好了,txt格式如下:
001 王一 98 99 85
002 王二 95 78 99
003 王三 85 86 88
004 王四 94 86 82

请问怎么调用函数readdata,能把数据对应读到结构体中,然后用printf函数打印出来呢?T T
最佳答案
2020-6-5 10:18:23
ifstream ifs(_F_STOCK);        //输入方式打开文件

        char buf[1024] = {0};
        ls.clear();
        //取出表头
        ifs.getline(buf, sizeof(buf));

        while(!ifs.eof())        //没到文件结尾
        {
                student tmp;

                ifs.getline(buf, sizeof(buf));        //读取一行

                char *sst = strtok(buf, "|");        //以"|"分隔
                if(sst != NULL)
                {
                        num = sst;
                }
                else
                {
                        break;
                }

                sst = strtok(NULL, "|");
                tmp.name = sst;        //名字

                sst = strtok(NULL, "|");
                tmp.s1 = atoi(sst);        

                sst = strtok(NULL, "|");
                tmp.s2 = atoi(sst);
                
                sst = strtok(NULL, "|");
                tmp.s3 = atoi(sst);

                ls.push_back(tmp);        //放在链表的后面
        }

这是我以前写的读取文件,你可以试着参考一下,我文件里各项是用“|”分隔的,所以strtok里的第二个参数是“|”,你的是空格,所以用空格就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-5 09:23:01 | 显示全部楼层
void readdata(FILE *fp,stu s[max],int *n)
{
    for(int i=0;fscanf(fp,"%s%s%d%d%d",s[i].num,s[i].name,s[i].s1,s[i].s2,s[i].s3)!=EOF&&i<10;i++)
    ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 09:23:56 | 显示全部楼层
看一下这个吧https://blog.csdn.net/xiaopang_yan/article/details/51956405,我也不太清楚,文件我不太懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 09:29:52 | 显示全部楼层
每一条记录的区分都是以'\n'为准的,字段与字段间也是通过空格划分的;
整个文件结束以EOF为标志。
所以思路可以通过文件内容中换行符的判断实现每条记录读取,通过空格【或换行符(单条记录最后一个字段)或结束符EOF(最后那个可能是EOF)]判断单个字段的长度,
写入对应结构体即可,还有注意点:数值如果是字符型就需要进行一定手段转换;比如通过数组暂存然后按位取出按照ASCII码转换,按权相加再赋值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 10:18:23 | 显示全部楼层    本楼为最佳答案   
ifstream ifs(_F_STOCK);        //输入方式打开文件

        char buf[1024] = {0};
        ls.clear();
        //取出表头
        ifs.getline(buf, sizeof(buf));

        while(!ifs.eof())        //没到文件结尾
        {
                student tmp;

                ifs.getline(buf, sizeof(buf));        //读取一行

                char *sst = strtok(buf, "|");        //以"|"分隔
                if(sst != NULL)
                {
                        num = sst;
                }
                else
                {
                        break;
                }

                sst = strtok(NULL, "|");
                tmp.name = sst;        //名字

                sst = strtok(NULL, "|");
                tmp.s1 = atoi(sst);        

                sst = strtok(NULL, "|");
                tmp.s2 = atoi(sst);
                
                sst = strtok(NULL, "|");
                tmp.s3 = atoi(sst);

                ls.push_back(tmp);        //放在链表的后面
        }

这是我以前写的读取文件,你可以试着参考一下,我文件里各项是用“|”分隔的,所以strtok里的第二个参数是“|”,你的是空格,所以用空格就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 10:20:06 | 显示全部楼层
上面那个是在我原来的代码的基础上按你的需求改了一下内容,但不是完全适用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 15:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表