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();
} //写的方式: 自己移动
fputc('a', fp);
fputc('b', fp);
fputc('c', fp); //打开文件
fclose(fp); //只读文件
FILE *read = fopen("fopen_01.txt", "r"); if (!read) {
printf("打开文件失败\n");
exit();
} //读文件
//fgetc(): 放回int值, 以字符形式获取
int ch = fgetc(read);
while (ch != EOF)
{
putchar(ch); //打印字符到命令行
ch = fgetc(read);
} printf("\n"); fclose(read); return ; }

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();
} //写的方式: 自己移动
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();
} //读文件
char str[] = "";
//设置读取的长度
while (fgets(str, , read))
{
puts(str);
}
//puts(str); fclose(read); return ; }

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[];
int age;
double num;
}mystudent; int main()
{
//写文件
FILE *fp = fopen("fread_fwrite_03.bat", "wb");
if (fp == NULL) {
printf("打开失败\n");
exit();
} while (true)
{
printf("输入姓名-年龄-成绩:\n");
scanf("%s%d%lf", &mystudent.name, &mystudent.age, &mystudent.num);
//参数: 源起始位置, 写多少(字节), 写的次数, 目的地
// &mystudent, sizeof(struct student), 1, fp
fwrite(&mystudent, sizeof(struct student), , 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();
} //以二进制形式读取
while (fread(&mystudent, sizeof(struct student), , read) > ) {
printf("姓名\t年龄\t成绩:\n");
printf("%s\t%d\t%.2f\n", mystudent.name, mystudent.age, mystudent.num);
} fclose(read); return ; }

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 = + ;
struct student
{
char name[];
int age;
double num;
}stus[maxn]; int main()
{
////写文件
FILE *fp = fopen("fread_fwrite_03.bat", "wb");
if (fp == NULL) {
printf("打开失败\n");
exit();
} int cnt;
scanf("%d", &cnt);
for (int i = ; 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, fp
fwrite(stus, sizeof(struct student), cnt, fp); fclose(fp); //读取文件
FILE *read = fopen("fread_fwrite_03.bat", "rb");
if (!read) {
printf("文件打开失败\n");
exit();
} student read_demo[maxn];
fread(read_demo, sizeof(struct student), cnt, read); for (int i = ; 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 ; }

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 = ;
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();
} 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();
} while (fscanf(read, "%s%d%lf", mystu.name, &mystu.age, &mystu.score) > )
{
//标准输出
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[];
int age;
double num;
}stus[]; int main()
{
//以二进制形式写文件
FILE *fp = fopen("fseek_rewind_06.txt", "wb+");
if (!fp) {
printf("failure!\n");
exit();
}
int N;
cin >> N;
for (int i = ; 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, , SEEK_SET); //移动到第二个数据位置
Student tmp;
fseek(fp, 1L * sizeof(struct Student), SEEK_SET);
fread(&tmp, sizeof(struct Student), , fp);
printf("第二个数据: \n");
printf("%s\t%d\t%.2f\n", tmp.name, tmp.age, tmp.num); //移动到最后一个位置(之后无元素)
fseek(fp, , 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), , fp);
printf("最后一个元素: \n");
printf("%s\t%d\t%.2f\n", tmp.name, tmp.age, tmp.num); //直接移动到文件开始位置
Student stu[];
rewind(fp);
printf("全部数据: \n");
int len = fread(stu, sizeof(struct Student), N, fp);
for (int i = ; i < len; i++){
printf("%s\t%d\t%.2f\n", stu[i].name, stu[i].age, stu[i].num);
} fclose(fp); return ; }

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. ThinkPad E470 win10,重装win10专业版后无声音

    解决办法: 1.官网下载笔记本对应的声卡驱动并安装 2.下载热键驱动并安装 3.重启笔记本即可 参考:https://blog.csdn.net/u012369373/article/details/ ...

  2. K3CLOUD新增用户

    1.在金蝶云之家对应的产品序列中新增用户 2.在CLOUD本地查询用户-同步注册用户后,云平台用户会同步至本地

  3. 转 PV、TPS、QPS 计算方法

    PV.TPS.QPS是怎么计算出来的?   QPS = req/sec = 请求数/秒 [QPS计算PV和机器的方式] QPS统计方式 [一般使用 http_load 进行统计]QPS = 总请求数 ...

  4. BZOJ4538 HNOI2016网络(树链剖分+线段树+堆/整体二分+树上差分)

    某两个点间的请求只对不在这条路径上的询问有影响.那么容易想到每次修改除该路径上的所有点的答案.对每个点建个两个堆,其中一个用来删除,线段树维护即可.由于一条路径在树剖后的dfs序中是log个区间,所以 ...

  5. BZOJ5249 九省联考2018IIIDX(线段树+贪心)

    显然这形成了一个树形结构.考虑这样一种贪心:按照曲目顺序,每次取消其父亲的预留,并选择当前可选择(保证其子树有合法选择且满足预留)的最大值,然后对其子树预留出大于等于他的一些值.这个做法显然是正确的. ...

  6. 注册页面手机验证码无跳转接收[html+js+ajax+php]

    [学习笔记] 来源:注册时需要使用短信验证码,但是注册的时候,点击接收验证码时,会产生跳转(尼玛,这不是我想要的啊!o(╥﹏╥)o) 查询资料和看书之后,知道使用js+ajax可以实现,就从网上找了一 ...

  7. HDU - 1260 (Tickets)

    题意:  买票    一个人要么自己买  要么和前面的人一起买   这两种情况分别有一个买票所花费的时间  求总的花费时间最小 解析: dp[i] 表示前i个人买票总的花费时间 v[i]表示第i个人买 ...

  8. MT【30】椭圆的第二定义解题

    问题:上式表示的区域是怎样的? 解答:利用椭圆第二定义易知当取等号时为椭圆,又令$y$趋向于$+\infty$时不等号不成立,故可以判断为椭圆内部区域. 评:利用mathmatics软件容易得到

  9. 自学Zabbix4.2.1 Application介绍

    自学Zabbix4.2.1 Application介绍 Applications应用程序是item的一个组.例如我们要监控MySQL,我们可以将所有和MySQL相关的item放到这个应用程序中.例如M ...

  10. helm详解

    helm 可以理解为 Kubernetes 的包管理工具,可以方便地发现.共享和使用为Kubernetes构建的应用. 一.基本概念1.Helm的三个基本概念Chart:Helm应用(package) ...