零的执行人 发表于 2020-6-5 09:09:26

文件操作1

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

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


int main()
{

        int choice;
        int i,n;
        stu s;
        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.num ,s.name ,s.s1 ,s.s2 ,s.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 09:23:01

void readdata(FILE *fp,stu s,int *n)
{
    for(int i=0;fscanf(fp,"%s%s%d%d%d",s.num,s.name,s.s1,s.s2,s.s3)!=EOF&&i<10;i++)
    ;
}

小甲鱼的铁粉 发表于 2020-6-5 09:23:56

看一下这个吧https://blog.csdn.net/xiaopang_yan/article/details/51956405,我也不太清楚,文件我不太懂

CodingCat_k 发表于 2020-6-5 09:29:52

每一条记录的区分都是以'\n'为准的,字段与字段间也是通过空格划分的;
整个文件结束以EOF为标志。
所以思路可以通过文件内容中换行符的判断实现每条记录读取,通过空格【或换行符(单条记录最后一个字段)或结束符EOF(最后那个可能是EOF)]判断单个字段的长度,
写入对应结构体即可,还有注意点:数值如果是字符型就需要进行一定手段转换;比如通过数组暂存然后按位取出按照ASCII码转换,按权相加再赋值

梦想灬远帆 发表于 2020-6-5 10:18:23

ifstream ifs(_F_STOCK);        //输入方式打开文件

        char buf = {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里的第二个参数是“|”,你的是空格,所以用空格就行

梦想灬远帆 发表于 2020-6-5 10:20:06

上面那个是在我原来的代码的基础上按你的需求改了一下内容,但不是完全适用
页: [1]
查看完整版本: 文件操作1