• C语言文件操作总结


    目录

    字符方式读入文件

    数据块方式读写文件

    文件定位与随机读写

    文件中数据的修改


    字符方式读入文件

    1.向文件中写入(输入字符)

            用 fputc 函数或 puts 函数可以把一个字符写到磁盘文件中去。

    int fputc(int ch,FILE * fp)

            ch 是要输出的字符,他可以是一个字符常量,也可以是一个字符变量;fp是文件指针变量,已经指向了一个由fopen函数打开的文件。

            功能:fputc(ch,fp)函数将字符输入到fp所指向的流式文件中去。如果输出成功,返回值就是输入的字符,失败则返回EOF。

    从键盘输入遗传字符,以回车符\n结束,然后输入到磁盘文件中去

    1. #include
    2. #include
    3. int main()
    4. {
    5. //从键盘输入遗传字符,以回车符\n结束,然后输入到磁盘文件中去
    6. FILE * fp;
    7. char ch;
    8. if((fp=fopen("output1.txt","w"))==NULL)
    9. {
    10. printf("无法创建文件!");
    11. exit(0);
    12. }
    13. while((ch=getchar())!='\n')
    14. {
    15. fputc(ch,fp);
    16. }
    17. fclose(fp);
    18. return 0;
    19. }

    2.从文件中读出一个字符

            用 fgetc 函数或者 getc 函数可以从磁盘中读出一个字符。

    int fgetc(FILE * fp)

            从磁盘文键逐个读入字符,并在终端输出

    1. #include
    2. #include
    3. int main()
    4. {
    5. //从磁盘文键逐个读入字符,并在终端输出
    6. FILE * fp;
    7. char ch;
    8. if((fp=fopen("output1.txt","r"))==NULL)
    9. {
    10. printf("无法打开文件!\n");
    11. exit(0);
    12. }
    13. while((ch=fgetc(fp))!=EOF)
    14. {
    15. putchar(ch);
    16. }
    17. fclose(fp);
    18. return 0;
    19. }

    3.向文件中写入一个字符串

            用 fputs 函数可以把一个字符串输入到指定的流式文件中,其原型为

    int fputs(char * fp,FILE * stream)

            其中,string为字符串,stream为文件指针。

     把指针string所指向的字符串输出到文件指针stream所指向的文件中,但字符串结束符‘\0’不输出

     从键盘输入若干行字符,把他们输出到磁盘文件中保存起来。

    1. #include
    2. #include
    3. int main()
    4. {
    5. //从键盘输入若干行字符,把他们输出到磁盘文件中保存起来。
    6. FILE * fp;
    7. char string[81];
    8. if((fp=fopen("data.txt","w"))==NULL)
    9. {
    10. printf("未找到此文件!");
    11. exit(0);
    12. }
    13. while(gets(string)!=NULL)//ctrl+Z结束
    14. {
    15. fputs(string,fp);
    16. fputc('\n',fp);//在每个字符串后加一个换行符
    17. }
    18. fclose(fp);
    19. return 0;
    20. }

    数据块方式读写文件

    使用数据块的方式对二进制问价进行读写操作,涉及的函数有两个:fread() 和 fwrite() 。

    建立学生档案文件,每个记录包括学生的姓名,性别,年龄和入学总分 

    1. #include
    2. #include
    3. struct student
    4. {
    5. char name[10];
    6. char sex;
    7. int age;
    8. float score;
    9. };
    10. int main()
    11. {
    12. FILE * fp;
    13. struct student stud;
    14. char str[80],ch='y';
    15. if((fp=fopen("stud2.rec","wb"))==NULL)//二进制只写方式打开
    16. {
    17. printf("无法打开文件!\n");
    18. exit(0);
    19. }
    20. while(ch=='y'||ch=='Y')
    21. {
    22. printf("输入姓名:");
    23. gets(stud.name);
    24. printf("输入性别:");
    25. gets(str);stud.sex=str[0];
    26. printf("输入年龄:");
    27. gets(str);stud.age=atoi(str);//年龄:将字符串转换为整型
    28. printf("输入分数:");
    29. gets(str);stud.score=atof(str);//分数:将字符串转换为浮点型
    30. fwrite(&stud,sizeof(stud),1,fp);//写入数据到文件
    31. do
    32. {
    33. printf("继续输入:(y/n)? ");
    34. gets(str);
    35. ch=str[0];
    36. } while(!(ch=='y'||ch=='n'||ch=='Y'||ch=='N'));
    37. }
    38. fclose(fp);
    39. return 0;
    40. }

    从磁盘文件按记录读取数据,并显示读入的内容,直到文件尾

    1. #include
    2. #include
    3. struct student
    4. {
    5. char name[10];
    6. char sex;//'M',或'F'
    7. int age;
    8. float score;
    9. };
    10. int main()
    11. {
    12. //从磁盘文件按记录读取数据,并显示读入的内容,直到文件尾
    13. struct student stud;
    14. FILE * fp;
    15. if((fp=fopen("stud2.rec","rb"))==NULL)
    16. {
    17. printf("无法打开文件stud2.rec!\n");
    18. exit(0);
    19. }
    20. while(fread(&stud,sizeof(stud),1,fp)==1)
    21. {
    22. printf("\n姓名:%s",stud.name);
    23. printf("\n性别:%c",stud.sex);
    24. printf("\n年龄:%d",stud.age);
    25. printf("\n分数:%.2f",stud.score);
    26. }
    27. printf("\n");
    28. fclose(fp);
    29. return 0;
    30. }

    文件定位与随机读写

    文件的定位:利用fesk()和ftell()函数编写程序测量一个文件的长度 

    1. #include
    2. #include
    3. //文件的定位
    4. //利用fesk()和ftell()函数编写程序测量一个文件的长度
    5. long filesize(FILE * fp)
    6. {
    7. long curpos,length;//当前文件读写位置指针相当于文件开头的位移量
    8. curpos=ftell(fp);//保存文件的当前读写位置指针
    9. fseek(fp,0L,SEEK_END);//文件读写位置指针置于文件尾端
    10. length=ftell(fp);//求文件长度
    11. fseek(fp,curpos,SEEK_SET);//恢复文件的原读写位置的指针
    12. return length;
    13. }
    14. long filesize(FILE * stream);
    15. int main()
    16. {
    17. FILE * stream;
    18. char filename[10];
    19. printf("\n输入文件名:");
    20. scanf("%s",filename);
    21. if((stream=fopen(filename,"rb"))==NULL)
    22. {
    23. printf("无法打开文件:%s\n",filename);
    24. exit(0);
    25. }
    26. printf("%s的文件大小是%ld(byte)\n",filename,filesize(stream));
    27. fclose(stream);
    28. return 0;
    29. }

    随机读写: 

    由之前建立的学生入学档案的磁盘文件stud.rec中,假设学生按照分数升序排列。
    现要求设计一个程序,输入一个整型值给n,输出分数最高的n个学生记录,即排在尾部的n个学生记录 

    1. #include
    2. #include
    3. struct student
    4. {
    5. char name[10];
    6. char sex;//'M',或'F'
    7. int age;
    8. float score;
    9. };
    10. //由之前建立的学生入学档案的磁盘文件stud.rec中,假设学生按照分数升序排列。
    11. //现要求设计一个程序,输入一个整型值给n,输出分数最高的n个学生记录,即排在尾部的n个学生记录
    12. int main()
    13. {
    14. FILE * fp;
    15. struct student stud;
    16. int n;
    17. if((fp=fopen("stud.rec","rb"))==NULL)
    18. {
    19. printf("无法打开文件");
    20. exit(0);
    21. }
    22. printf("\n请输入一个整数:");
    23. scanf("%d",&n);
    24. fseek(fp,-n*sizeof(stud),SEEK_END); //定位到倒数第n个学生记录
    25. while(fread(&stud,sizeof(stud),1,fp)==1)
    26. {
    27. printf("\n姓名:%s",stud.name);
    28. printf("\n性别:%c",stud.sex);
    29. printf("\n年龄:%d",stud.age);
    30. printf("\n分数:%.2f",stud.score);
    31. }
    32. return 0;
    33. }

    文件中数据的修改

    将之前的成绩表中的女生成绩加五分

    1. #include
    2. #include
    3. struct student
    4. {
    5. char name[10];
    6. char sex;//'M',或'F'
    7. int age;
    8. float score;
    9. };
    10. int main()
    11. {
    12. //从磁盘文件按记录读取数据,并显示读入的内容,直到文件尾
    13. struct student stud;
    14. FILE * fp;
    15. if((fp=fopen("stud.rec","rb"))==NULL)
    16. {
    17. printf("无法打开文件stud2.rec!\n");
    18. exit(0);
    19. }
    20. while(fread(&stud,sizeof(stud),1,fp)==1)
    21. {
    22. printf("\n姓名:%s",stud.name);
    23. printf("\n性别:%c",stud.sex);
    24. printf("\n年龄:%d",stud.age);
    25. printf("\n分数:%.2f",stud.score);
    26. }
    27. printf("\n");
    28. fclose(fp);
    29. return 0;
    30. }

    输入一个学生的姓名,编写程序将stud.rec中该学生的记录删除 

    1. #include
    2. #include
    3. #include
    4. struct student
    5. {
    6. char name[10];
    7. char sex;//'M',或'F'
    8. int age;
    9. float score;
    10. };
    11. //输入一个学生的姓名,编写程序将stud.rec中该学生的记录删除
    12. int main()
    13. {
    14. char name[10];
    15. FILE * fp_old,* fp_new;
    16. struct student stud;
    17. if((fp_old=fopen("stud.rec","rb"))==0)//读方式打开原数据文件
    18. {
    19. printf("\n不能打开文件");
    20. exit(0);
    21. }
    22. if((fp_new=fopen("stud3.rec","wb"))==0)//写方式创建新数据文件
    23. {
    24. printf("\n不能创建文件");
    25. exit(0);
    26. }
    27. printf("请输入要删除的学生姓名:");
    28. gets(name);
    29. while(fread(&stud,sizeof(stud),1,fp_old)==1)
    30. {
    31. //在原文件中读取一个学生记录在stud中
    32. if(strcmp(stud.name,name)!=0)
    33. {
    34. fwrite(&stud,sizeof(stud),1,fp_new);
    35. }
    36. }
    37. fclose(fp_old);
    38. fclose(fp_new);
    39. remove("stud.rec");//删除原文件
    40. rename("stud3.rec","stud.rec"); //将新文件重命名
    41. return 0;
    42. }

    向文件中插入数据

    1. #include
    2. #include
    3. #include
    4. struct student
    5. {
    6. char name[10];
    7. char sex;//'M',或'F'
    8. int age;
    9. float score;
    10. };
    11. int main()
    12. {
    13. FILE * fp;
    14. struct student x,t={
    15. "Alex",'f',20,566
    16. };
    17. if((fp=fopen("stud.rec","a+b"))==0)
    18. {
    19. printf("\n\t无法打开文件!\n");
    20. exit(0);
    21. }
    22. fread(&x,sizeof(struct student),1,fp);//从文件中读一条学生记录
    23. fseek(fp,0L,SEEK_END);
    24. fwrite(&t,sizeof(struct student),1,fp);//将t中的数据追加到文件尾
    25. rewind(fp);
    26. while(fread(&x,sizeof(struct student),1,fp)==1)
    27. {
    28. printf("\n%15s%4c%8d%8.2f",x.name,x.sex,x.age,x.score);
    29. }
    30. fclose(fp);
    31. return 0;
    32. }

  • 相关阅读:
    Blender+fSpy实现3D渲染结果与2D图像融合
    burpsuite+proxifier小程序抓包
    Spring之拦截器
    cocosCreator 之 dispatchEvent事件分发
    Oracle 数据库查询下级_Oracle数据库之递归查询
    虚拟仿真测试介绍(9):硬件在环(HIL)测试简介
    Hive DDL操作出现卡住现象源码分析与解决方法
    Arduino中安装ESP32网络抽风无法下载 暴力解决办法 python
    Mobpush上线跨时区推送功能,助力中国开发者应用出海
    MySQL删除数据库(DROP DATABASE语句)
  • 原文地址:https://blog.csdn.net/weixin_55848732/article/details/132416235