C语言—文件操作

1.1 fgetc() + fputc(): 以 字符 形式存取数据定义文件指针

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <cstdio>
  3. #include <cstdlib>
  4. using namespace std;
  5. /*
  6. 文件结束标志: EOF --- feof()
  7. 读写文件:
  8. fgetc: file get char 以字符形式获取
  9. fputc: file put char 以字符形式写到文件
  10. */
  11. int main()
  12. {
  13. //定义文件指针
  14. FILE *fp;
  15. //打开文件
  16. fp = fopen("fopen_01.txt", "w+");
  17. //判断文件打开是否成功
  18. if (!fp) {
  19. printf("打开文件失败\n");
  20. exit();
  21. }
  22. //写的方式: 自己移动
  23. fputc('a', fp);
  24. fputc('b', fp);
  25. fputc('c', fp);
  26. //打开文件
  27. fclose(fp);
  28. //只读文件
  29. FILE *read = fopen("fopen_01.txt", "r");
  30. if (!read) {
  31. printf("打开文件失败\n");
  32. exit();
  33. }
  34. //读文件
  35. //fgetc(): 放回int值, 以字符形式获取
  36. int ch = fgetc(read);
  37. while (ch != EOF)
  38. {
  39. putchar(ch); //打印字符到命令行
  40. ch = fgetc(read);
  41. }
  42. printf("\n");
  43. fclose(read);
  44. return ;
  45. }

2.2 fgets() + fputs(): 以 字符串 形式存取数据

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <cstdlib>
  3. #include <cstdio>
  4. using namespace std;
  5. /*
  6. int fputs(char *str, FILE *fp);
  7. char* fgets(char *str, int n, FILE *fp);
  8. */
  9. int main()
  10. {
  11. FILE *fp = fopen("fgets_fputs_02.txt", "w+");
  12. if (!fp) {
  13. printf("打开文件失败");
  14. exit();
  15. }
  16. //写的方式: 自己移动
  17. int isok = fputs("Douzi is cute\n I love china!\n who are you?", fp);
  18. //返回非负值,表示成功
  19. printf("返回非负值表示成功: %d\n", isok);
  20. fclose(fp);
  21. FILE *read = fopen("fgets_fputs_02.txt", "r");
  22. if (!read) {
  23. printf("打开文件失败\n");
  24. exit();
  25. }
  26. //读文件
  27. char str[] = "";
  28. //设置读取的长度
  29. while (fgets(str, , read))
  30. {
  31. puts(str);
  32. }
  33. //puts(str);
  34. fclose(read);
  35. return ;
  36. }

2.3 fread() + fwrite(): 以 二进制 形式存取数据

2.3.1 结构体数据

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <cstring>
  6. using namespace std;
  7. /*
  8. //以二进制形式存储数据
  9. int fwrite(void *buffer,unsigned size, unsigned count, FILE * fp)
  10. //以什么方式写进去就以什么方式读出 !!
  11. int fread(void *buffer,unsigned size, unsigned count, FILE * fp)
  12. */
  13. struct student
  14. {
  15. char name[];
  16. int age;
  17. double num;
  18. }mystudent;
  19. int main()
  20. {
  21. //写文件
  22. FILE *fp = fopen("fread_fwrite_03.bat", "wb");
  23. if (fp == NULL) {
  24. printf("打开失败\n");
  25. exit();
  26. }
  27. while (true)
  28. {
  29. printf("输入姓名-年龄-成绩:\n");
  30. scanf("%s%d%lf", &mystudent.name, &mystudent.age, &mystudent.num);
  31. //参数: 源起始位置, 写多少(字节), 写的次数, 目的地
  32. // &mystudent, sizeof(struct student), 1, fp
  33. fwrite(&mystudent, sizeof(struct student), , fp);
  34. printf("是否继续?(Y/N)");
  35. //清除缓冲区
  36. //否则下面的字符无法输入,因为上面输入按下回车,"回车"会被下面的getchar()吃掉,而无法自己输入
  37. fflush(stdin);
  38. int ch = getchar();
  39. if (ch == 'N' || ch == 'n') {
  40. break;
  41. }
  42. }
  43. fclose(fp);
  44. //读取文件
  45. FILE *read = fopen("fread_fwrite_03.bat", "rb");
  46. if (!read) {
  47. printf("文件打开失败\n");
  48. exit();
  49. }
  50. //以二进制形式读取
  51. while (fread(&mystudent, sizeof(struct student), , read) > ) {
  52. printf("姓名\t年龄\t成绩:\n");
  53. printf("%s\t%d\t%.2f\n", mystudent.name, mystudent.age, mystudent.num);
  54. }
  55. fclose(read);
  56. return ;
  57. }

2.3.2 结构体数组

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <cstring>
  6. using namespace std;
  7. /*
  8. //以二进制形式存储数据
  9. int fwrite(void *buffer,unsigned size, unsigned count, FILE * fp)
  10. //以什么方式写进去就以什么方式读出 !!
  11. int fread(void *buffer,unsigned size, unsigned count, FILE * fp):
  12. count: 知道有多少数据可以读取
  13. */
  14. const int maxn = + ;
  15. struct student
  16. {
  17. char name[];
  18. int age;
  19. double num;
  20. }stus[maxn];
  21. int main()
  22. {
  23. ////写文件
  24. FILE *fp = fopen("fread_fwrite_03.bat", "wb");
  25. if (fp == NULL) {
  26. printf("打开失败\n");
  27. exit();
  28. }
  29. int cnt;
  30. scanf("%d", &cnt);
  31. for (int i = ; i < cnt; i++)
  32. {
  33. printf("输入姓名-年龄-成绩:\n");
  34. scanf("%s%d%lf", &stus[i].name, &stus[i].age, &stus[i].num);
  35. //清除缓冲区
  36. //否则下面的字符无法输入,因为上面输入按下回车,"回车"会被下面的getchar()吃掉,而无法自己输入
  37. fflush(stdin);
  38. }
  39. //参数: 源起始位置, 写多少(字节), 写的次数, 目的地
  40. // stus, sizeof(struct student), cnt, fp
  41. fwrite(stus, sizeof(struct student), cnt, fp);
  42. fclose(fp);
  43. //读取文件
  44. FILE *read = fopen("fread_fwrite_03.bat", "rb");
  45. if (!read) {
  46. printf("文件打开失败\n");
  47. exit();
  48. }
  49. student read_demo[maxn];
  50. fread(read_demo, sizeof(struct student), cnt, read);
  51. for (int i = ; i < cnt; i++){
  52. printf("姓名\t年龄\t成绩:\n");
  53. printf("%s\t%d\t%.2f\n", read_demo[i].name, read_demo[i].age, read_demo[i].num);
  54. }
  55. return ;
  56. }

2.4 fprintf() + fscanf():模式化读写文件数据

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <cstdio>
  3. #include <cstdlib>
  4. using namespace std;
  5. /*
  6. //printf: 多了指定位置
  7. //参数: 指定位置, 与printf一样的格式化【类似%d这样】, 参数列表
  8. int fscanf(FILE *fp, char *format, arg_list);
  9. int fprintf(FILE *fp, char *format, arg_list);
  10. stdin: 标准输入 -- 键盘输入
  11. stdout: 标准输出 -- 屏幕输出
  12. FILE *: 自定义输入输出​
  13. */
  14. const int maxn = ;
  15. struct Student
  16. {
  17. char name[maxn];
  18. int age;
  19. double score;
  20. } mystu, stu[maxn];
  21. int main()
  22. {
  23. //写文件
  24. ////标准输入输出
  25. //printf("请输入姓名,年龄,成绩: \n");
  26. //fscanf(stdin, "%s%d%lf", mystu.name, &mystu.age, &mystu.score);
  27. //fprintf(stdout, "%s\t%d\t%.1f\n", mystu.name, mystu.age, mystu.score);
  28. FILE *fp = fopen("fscanf_fprintf_04.txt", "w+");
  29. if (!fp) {
  30. printf("failure!\n");
  31. exit();
  32. }
  33. while (true)
  34. {
  35. printf("输入姓名-年龄-成绩: \n");
  36. //标准输入,写入文件
  37. fscanf(stdin, "%s%d%lf", mystu.name, &mystu.age, &mystu.score);
  38. //写入文件
  39. fprintf(fp, "%s\t%d\t%.2f\n", mystu.name, mystu.age, mystu.score);
  40. fflush(stdin);
  41. printf("是否继续?(Y/N)");
  42. int ch = getchar();
  43. if (ch == 'N' || ch == 'n') {
  44. break;
  45. }
  46. }
  47. fclose(fp);
  48. //读文件
  49. FILE *read = fopen("fscanf_fprintf_04.txt", "r+");
  50. if (!read) {
  51. printf("failure\n");
  52. exit();
  53. }
  54. while (fscanf(read, "%s%d%lf", mystu.name, &mystu.age, &mystu.score) > )
  55. {
  56. //标准输出
  57. fprintf(stdout, "%s\t%d\t%.2f\n", mystu.name, mystu.age, mystu.score);
  58. }
  59. fclose(read);
  60. }

3.1 文件指针: fseek() + rewind() 

  •  ftell(fp): 现在所在位置(可用来求数据个数)

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstdio>
  5. using namespace std;
  6. /*
  7. fseek: fseek(文件类型指针, 位移量, 起始点) 位移量必须是long类型
  8. 起始点: (宏)
  9. SEEK_SET 文件首 0;
  10. SEEK_CUR 文件当前位置 1;
  11. SEEK_END 文件尾部 2;
  12. 以二进制形式存储数据
  13. int fwrite(void *buffer,unsigned size, unsigned count, FILE * fp)
  14. //以什么方式写进去就以什么方式读出 !!
  15. int fread(void *buffer,unsigned size, unsigned count, FILE * fp)
  16. */
  17. struct Student
  18. {
  19. char name[];
  20. int age;
  21. double num;
  22. }stus[];
  23. int main()
  24. {
  25. //以二进制形式写文件
  26. FILE *fp = fopen("fseek_rewind_06.txt", "wb+");
  27. if (!fp) {
  28. printf("failure!\n");
  29. exit();
  30. }
  31. int N;
  32. cin >> N;
  33. for (int i = ; i < N; i++)
  34. {
  35. printf("输入姓名-年龄-分数:\n");
  36. scanf("%s%d%lf", stus[i].name, &stus[i].age, &stus[i].num);
  37. fflush(stdin);
  38. }
  39. //写入文件
  40. //存N个数据
  41. fwrite(stus, sizeof(struct Student), N, fp);
  42. //fseek(文件类型指针, 位移量, 起始点) 位移量必须是long类型
  43. //SEEK_SET 文件首 0;
  44. //注意点: 移动多个位置, long L :表示
  45. //正负: 往后- 往前+
  46. fseek(fp, , SEEK_SET);
  47. //移动到第二个数据位置
  48. Student tmp;
  49. fseek(fp, 1L * sizeof(struct Student), SEEK_SET);
  50. fread(&tmp, sizeof(struct Student), , fp);
  51. printf("第二个数据: \n");
  52. printf("%s\t%d\t%.2f\n", tmp.name, tmp.age, tmp.num);
  53. //移动到最后一个位置(之后无元素)
  54. fseek(fp, , SEEK_END);
  55. long size = ftell(fp); //ftell:现在所在位置(表达这个文件的大小)
  56. int number = size / sizeof(Student);
  57. printf("有几个数据%d: \n", number);
  58. //移动到最后一个元素之前位置 位移量必须是long类型,需要类型转换
  59. fseek(fp, -1L * (long)sizeof(struct Student), SEEK_END);
  60. fread(&tmp, sizeof(struct Student), , fp);
  61. printf("最后一个元素: \n");
  62. printf("%s\t%d\t%.2f\n", tmp.name, tmp.age, tmp.num);
  63. //直接移动到文件开始位置
  64. Student stu[];
  65. rewind(fp);
  66. printf("全部数据: \n");
  67. int len = fread(stu, sizeof(struct Student), N, fp);
  68. for (int i = ; i < len; i++){
  69. printf("%s\t%d\t%.2f\n", stu[i].name, stu[i].age, stu[i].num);
  70. }
  71. fclose(fp);
  72. return ;
  73. }

C语言上机复习(一)文件操作的更多相关文章

  1. C语言复习:文件操作

    文件操作专题 C语言文件读写概念 文件分类 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:存储介质文件(磁 ...

  2. 【Go语言】集合与文件操作

    本文目录 1.数据集合的主要操作 1_1.字典的声明 1_2.字典的初始化和创建 1_3.字典的访问和操作 1_4.其他类型的数据集 2.文件操作 2_1.文件操作概述os包和path包 2_2.文件 ...

  3. C++学习(二十八)(C语言部分)之 文件操作

    复习:#define 定义一个宏#include 文件包含#if 条件防止头文件重复包含定义一个宏 判断宏是否定义 判断头文件是否包含#define _STDIO_H_#include<stdi ...

  4. 17.3.15---C语言详解FILE文件操作

    FILE 是 C语言文件结构定义, 打开文件和文件操作要用到这类结构.可以看成变量类型,用于变量声明.这个是一种数据结构类型,用来表示一个文件的相关信息,如果定义了一个文件指针,就用这个指针来指向某个 ...

  5. 归纳整理Linux下C语言常用的库函数----文件操作

    在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...

  6. 说说Python 中的文件操作 和 目录操作

    我们知道,文件名.目录名和链接名都是用一个字符串作为其标识符的,但是给我们一个标识符,我们该如何确定它所指的到底是常规文件文件名.目录名还是链接名呢?这时,我们可以使用os.path模块提供的isfi ...

  7. 【阅读笔记】《C程序员 从校园到职场》第六章 常用文件操作函数 (Part 1)

    参考链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/24926023 让你提前认识软件开发(18):C语言中常用的文件操作函数总结 ...

  8. VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)

    上一节中鸡啄米讲了定时器Timer的用法,本节介绍下文件操作类CFile类的使用. CFile类概述 如果你学过C语言,应该知道文件操作使用的是文件指针,通过文件指针实现对它指向的文件的各种操作.这些 ...

  9. Node.js文件操作一

    Node.js和其他语言一样,也有文件操作.先不说node.js中的文件操作,其他语言的文件操作一般也都是有打开.关闭.读.写.文件信息.新建删除目录.删除文件.检测文件路径等.在node.js中也是 ...

随机推荐

  1. Eclipse:An internal error occurred during: "Building workspace". GC overhead limit exceeded

    http://blog.csdn.net/shaozhang872196/article/details/18552273 http://www.cnblogs.com/sonofelice/p/52 ...

  2. multer处理post请求的代码演示

    let express = require('express'); let multer = require('multer'); let mObj = multer({dest:__dirname+ ...

  3. RAID 磁盘阵列说明

    Copy From wiki RAID档次 最少硬盘 最大容错 可用容量 读取性能 写入性能 安全性 目的 应用产业 单一硬盘 (引用) 0 1 1 1 无     JBOD 1 0 n 1 1 无( ...

  4. linux bin & sbin different

    linux bin & sbin different flutter & $PATH http://blog.taylormcgann.com/2014/04/11/differenc ...

  5. SVG to Image in js

    SVG to Image in js SVG to Image https://image.online-convert.com/convert-to-svg https://stackoverflo ...

  6. LinkedList 实现 Queue

    package cn.com.example; import java.util.LinkedList; /** * Created by Jack on 2017/3/8. */ public cl ...

  7. BZOJ5338[TJOI2018]xor——主席树+dfs序

    题目描述 现在有一颗以1为根节点的由n个节点组成的树,树上每个节点上都有一个权值vi. 现在有Q 次操作,操作如下: 1  x y    查询节点x的子树中与y异或结果的最大值 2 x y z     ...

  8. VMWare 安装 Linux

    参考 : http://www.aboutyun.com/thread-6780-1-1.html     这的是很详细.赞一下 我这里就简化一下. 1 下载: VMWare :  https://d ...

  9. day5 if else elif 判断语句

    age_of_princal = 56 guess_age = int( input(">>:") ) '''伪代码,提供思路用 if guess_age == age ...

  10. Python函数绘图

    最近看数学,发现有时候画个图还真管用,对理解和展示效果都不错.尤其是三维空间和一些复杂函数,相当直观,也有助于解题.本来想用mathlab,下载安装都太费事,杀鸡不用牛刀,Python基本就能实现.下 ...