C语言—文件操作

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

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
using namespace std;/*
文件结束标志: EOF --- feof()读写文件:
fgetc: file get char 以字符形式获取
fputc: file put char 以字符形式写到文件*/
int main()
{//定义文件指针FILE *fp;//打开文件fp = fopen("fopen_01.txt", "w+");//判断文件打开是否成功if (!fp) {printf("打开文件失败\n");exit(0);}//写的方式: 自己移动fputc('a', fp);fputc('b', fp);fputc('c', fp);//打开文件
    fclose(fp);//只读文件FILE *read = fopen("fopen_01.txt", "r");if (!read) {printf("打开文件失败\n");exit(0);}//读文件//fgetc(): 放回int值, 以字符形式获取int ch = fgetc(read);while (ch != EOF){putchar(ch);        //打印字符到命令行ch = fgetc(read);}printf("\n");fclose(read);return 0;}

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

#define _CRT_SECURE_NO_WARNINGS
#include <cstdlib>
#include <cstdio>
using namespace std;/*int fputs(char *str, FILE *fp);
char* fgets(char *str, int n, FILE *fp);*/
int main()
{FILE *fp = fopen("fgets_fputs_02.txt", "w+");if (!fp) {printf("打开文件失败");exit(1);}//写的方式: 自己移动int isok = fputs("Douzi is cute\n I love china!\n who are you?", fp);//返回非负值,表示成功printf("返回非负值表示成功: %d\n", isok);fclose(fp);FILE *read = fopen("fgets_fputs_02.txt", "r");if (!read) {printf("打开文件失败\n");exit(1);}//读文件char str[50] = "";//设置读取的长度while (fgets(str, 50, read)){puts(str);}//puts(str);
fclose(read);return 0;}

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

2.3.1 结构体数据

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;/*
//以二进制形式存储数据
int fwrite(void *buffer,unsigned size, unsigned count, FILE * fp)//以什么方式写进去就以什么方式读出 !!
int fread(void *buffer,unsigned size, unsigned count, FILE * fp)
*/struct student
{char name[20];int age;double num;
}mystudent;int main()
{//写文件FILE *fp = fopen("fread_fwrite_03.bat", "wb");if (fp == NULL) {printf("打开失败\n");exit(1);}while (true){printf("输入姓名-年龄-成绩:\n");scanf("%s%d%lf", &mystudent.name, &mystudent.age, &mystudent.num);//参数: 源起始位置, 写多少(字节), 写的次数, 目的地//     &mystudent, sizeof(struct student), 1, fpfwrite(&mystudent, sizeof(struct student), 1, fp);printf("是否继续?(Y/N)");//清除缓冲区//否则下面的字符无法输入,因为上面输入按下回车,"回车"会被下面的getchar()吃掉,而无法自己输入
        fflush(stdin);int ch = getchar();if (ch == 'N' || ch == 'n') {break;}}fclose(fp);//读取文件FILE *read = fopen("fread_fwrite_03.bat", "rb");if (!read) {printf("文件打开失败\n");exit(1);}//以二进制形式读取while (fread(&mystudent, sizeof(struct student), 1, read) > 0) {printf("姓名\t年龄\t成绩:\n");printf("%s\t%d\t%.2f\n", mystudent.name, mystudent.age, mystudent.num);}    fclose(read);return 0;}

2.3.2 结构体数组

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;/*
//以二进制形式存储数据
int fwrite(void *buffer,unsigned size, unsigned count, FILE * fp)//以什么方式写进去就以什么方式读出 !!
int fread(void *buffer,unsigned size, unsigned count, FILE * fp):count: 知道有多少数据可以读取*/const int maxn = 1024 + 10;
struct student
{char name[20];int age;double num;
}stus[maxn];int main()
{////写文件FILE *fp = fopen("fread_fwrite_03.bat", "wb");if (fp == NULL) {printf("打开失败\n");exit(1);}int cnt;scanf("%d", &cnt);for (int i = 0; i < cnt; i++){printf("输入姓名-年龄-成绩:\n");scanf("%s%d%lf", &stus[i].name, &stus[i].age, &stus[i].num);        //清除缓冲区//否则下面的字符无法输入,因为上面输入按下回车,"回车"会被下面的getchar()吃掉,而无法自己输入
        fflush(stdin);}//参数: 源起始位置, 写多少(字节), 写的次数, 目的地//     stus, sizeof(struct student), cnt, fpfwrite(stus, sizeof(struct student), cnt, fp);fclose(fp);//读取文件FILE *read = fopen("fread_fwrite_03.bat", "rb");if (!read) {printf("文件打开失败\n");exit(1);}student read_demo[maxn];fread(read_demo, sizeof(struct student), cnt, read);for (int i = 0; i < cnt; i++){printf("姓名\t年龄\t成绩:\n");printf("%s\t%d\t%.2f\n", read_demo[i].name, read_demo[i].age, read_demo[i].num);}return 0;}

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

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
using namespace std;/*
//printf: 多了指定位置
//参数: 指定位置, 与printf一样的格式化【类似%d这样】, 参数列表
int fscanf(FILE *fp, char *format, arg_list);
int fprintf(FILE *fp, char *format, arg_list);stdin:  标准输入 -- 键盘输入stdout: 标准输出 -- 屏幕输出FILE *: 自定义输入输出​
*/const int maxn = 20;
struct Student
{char name[maxn];int age;double score;
} mystu, stu[maxn];int main()
{//写文件////标准输入输出//printf("请输入姓名,年龄,成绩: \n");//fscanf(stdin, "%s%d%lf", mystu.name, &mystu.age, &mystu.score);//fprintf(stdout, "%s\t%d\t%.1f\n", mystu.name, mystu.age, mystu.score);FILE *fp = fopen("fscanf_fprintf_04.txt", "w+");if (!fp) {printf("failure!\n");exit(1);}while (true){printf("输入姓名-年龄-成绩: \n");//标准输入,写入文件 fscanf(stdin, "%s%d%lf", mystu.name, &mystu.age, &mystu.score);//写入文件fprintf(fp, "%s\t%d\t%.2f\n", mystu.name, mystu.age, mystu.score);fflush(stdin);printf("是否继续?(Y/N)");int ch = getchar();if (ch == 'N' || ch == 'n') {break;}}fclose(fp);//读文件FILE *read = fopen("fscanf_fprintf_04.txt", "r+");if (!read) {printf("failure\n");exit(1);}while (fscanf(read, "%s%d%lf", mystu.name, &mystu.age, &mystu.score) > 0){//标准输出fprintf(stdout, "%s\t%d\t%.2f\n", mystu.name, mystu.age, mystu.score);}fclose(read);}

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

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

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;/*
fseek: fseek(文件类型指针, 位移量, 起始点) 位移量必须是long类型
起始点: (宏)
SEEK_SET 文件首 0;
SEEK_CUR 文件当前位置 1;
SEEK_END 文件尾部 2;以二进制形式存储数据
int fwrite(void *buffer,unsigned size, unsigned count, FILE * fp)
//以什么方式写进去就以什么方式读出 !!
int fread(void *buffer,unsigned size, unsigned count, FILE * fp)
*/
struct Student
{char name[20];int age;double num;
}stus[20];int main()
{//以二进制形式写文件FILE *fp = fopen("fseek_rewind_06.txt", "wb+");if (!fp) {printf("failure!\n");exit(1);}int N;cin >> N; for (int i = 0; i < N; i++){printf("输入姓名-年龄-分数:\n");scanf("%s%d%lf", stus[i].name, &stus[i].age, &stus[i].num);fflush(stdin);}//写入文件//存N个数据fwrite(stus, sizeof(struct Student), N, fp);//fseek(文件类型指针, 位移量, 起始点) 位移量必须是long类型//SEEK_SET 文件首 0;//注意点: 移动多个位置, long L :表示//正负: 往后- 往前+fseek(fp, 0, SEEK_SET);//移动到第二个数据位置
    Student tmp;fseek(fp, 1L * sizeof(struct Student), SEEK_SET);fread(&tmp, sizeof(struct Student), 1, fp);printf("第二个数据: \n");printf("%s\t%d\t%.2f\n", tmp.name, tmp.age, tmp.num);//移动到最后一个位置(之后无元素)fseek(fp, 0, SEEK_END);long size = ftell(fp);       //ftell:现在所在位置(表达这个文件的大小)int number = size / sizeof(Student);printf("有几个数据%d: \n", number);//移动到最后一个元素之前位置 位移量必须是long类型,需要类型转换fseek(fp, -1L * (long)sizeof(struct Student), SEEK_END);fread(&tmp, sizeof(struct Student), 1, fp);printf("最后一个元素: \n");printf("%s\t%d\t%.2f\n", tmp.name, tmp.age, tmp.num);//直接移动到文件开始位置Student stu[20];rewind(fp); printf("全部数据: \n");int len = fread(stu, sizeof(struct Student), N, fp);for (int i = 0; i < len; i++){printf("%s\t%d\t%.2f\n", stu[i].name, stu[i].age, stu[i].num);    }fclose(fp);return 0;}

转载于:https://www.cnblogs.com/douzujun/p/10321833.html

C语言上机复习(一)文件操作相关推荐

  1. 【C/C++语言入门篇】-- 文件操作

    [C/C++语言入门篇]-- 文件操作 收藏 此文于2010-03-09被推荐到CSDN首页 如何被推荐? 最近实在是太忙了,这篇整整就推迟了1个月了,实在是对不起.之前本打算这个模块就结束了,文件操 ...

  2. 按平均成绩排行c语言文件操作,学生成绩管理系统(c语言结构体以及文件操作)实验报告精选.doc...

    学生成绩管理系统(c语言结构体以及文件操作)实验报告精选 C程序设计 实验报告 编号: 姓名院系学号任课教师于萧指导教师实验地点实验时间实验名称文件操作同 组 人无预习报告(对实验主要内容的认识)得分 ...

  3. 【C语言详解】——文件操作(建议收藏)

    前言:本期我们就进入C语言的最后一部分--文件操作,说起文件,广大学子可以说苦其久已,但实际上文件这部分要掌握的内容并不多,熟知其原理即可.因为在以后的实际应用中几乎不会使用到C语言的文件,一般都是使 ...

  4. C语言使用FILE指针文件操作

    C语言使用FILE指针文件操作 文件的基本概念 所谓"文件"是指一组相关数据的有序集合.这个数据集有一个名称,叫做文件名.实际上我们已经多次使用了文件,例如源程序文件.目标文件.可 ...

  5. 【C语言刷题】文件操作章节配套练习(选择题 + 编程题)

    前言: 本篇为<维生素C语言>系列配套练习题,挑选了一些相对来说比较实用的练习,有助于巩固学习的知识.题目附带了答案和解析可供参考,顺便附上文件操作教学链接,可供复习: [维生素C语言]第 ...

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

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

  7. 将文件指针复位C语言,C语言学习笔记之 文件操作

    文件操作 文件指针 操作系统通过 函数(API) 操作文件,而函数通过文件指针识别不同文件 函数 --> 文件指针 --> 文件 打开和关闭文件 fopen打开文件 #include FI ...

  8. C语言基础教学(文件操作)

    文章目录 前言 一.文件操作基本介绍 二.编程练习 总结 前言 这篇文章我们来讲解C语言中的文件操作,文件操作在C语言中算是一个比较重要的知识点,我们每天都在和文件打交道,各种文件夹的打开和关闭操作, ...

  9. C语言linux下的文件操作(1)

    文件操作: 欢迎加入QQ:498903810 一起交流.讨论知识,里面有大佬,也有小白,天下码农一家亲,大家一起讨论进步. 1.静态文件(Inode) 硬盘中的文件,就是静态文件.每一个文件都是以多个 ...

  10. C语言基础教程_文件操作

    文章目录 前言 一.文件的概念 1.1文件的定义 1.2磁盘文件的分类 二.文件指针 三.打开文件fopen 四.关闭文件fclose 五.一次读写一个字节 5.1 fgetc 5.2 fputc 六 ...

最新文章

  1. Android Studio 单刷《第一行代码》系列 04 —— Activity 相关
  2. git推送密码_保护代码完整性(六):在 Git 上使用 PGP
  3. Linux 中识别 USB 设备名字的 4 种方法
  4. 第 8 章 配置listener监听器
  5. C#开发笔记之18-如何用C#模拟(传统方法)发送Post请求或Get请求?
  6. 【Elasticsearch】Elasticsearch中的相似度评分介绍
  7. Mac端将本地新项目上传到github
  8. spring jdbcTemplate查询使用
  9. 在一个数组中找到第k小的数(线性时间选择)
  10. html js 获取this,JavaScript中的this引用(推荐)
  11. 【运营小卖部】如何玩转社群?社群运营教程
  12. 九存支持 2018全球存储半导体大会暨全球闪存技术峰会
  13. 班级聚会(reunion)
  14. 认证的公众号可以快速免费注册认证小程序
  15. 【web安全】——文件上传的绕过方式
  16. 大连东软信息学院计算机排名,一骑绝尘!大连东软信息学院排名怎么样?
  17. 使用C#实现简单的21点小游戏
  18. ESB总线的核心架构
  19. Linux c语言 beep,用Beep()函数来实现c语言编写歌曲
  20. Canvas引入跨域的图片导致toDataURL()报错的问题的解决

热门文章

  1. 11个LOGO设计灵感网站推荐,帮你提高LOGO设计工作效率
  2. 关系型数据库的一对一、一对多、多对一、多对多关系
  3. 「新功能」对接金蝶云星空K3 Cloud插件支持版本升级
  4. vmware克隆linux虚拟机,报Device eth1 does not seem to be present,delaying initialization.错误
  5. 数据结构之数组的存储
  6. 网络看不到计算机和设备,网络发现已关闭,网络计算机和设备不可见。请启用网络和共享中心中的网络发现。解决方法...
  7. 游戏服务器应该怎么选择
  8. Multisim仿真:验证性实验-单管共射放大电路
  9. 人工智能——单层感知器
  10. 快速当前目录下打开cmd命令窗口