C语言中的文件操作(二)
本文为上篇文章的补充 C语言中的文件操作(一)
文章目录
- 前言
- 一.文件的指定读写
- 1.fseek
- 2.ftell
- 3.rewind
- 二.文本文件和二进制文件
- 1.文本文件:
- 2.二进制文件:
- 三.文件读取结束的判定
- 1.文本文件是否结束
- 2.二进制文件是否结束
- 四.文件缓冲区
- VS2019缓冲区测试:
- 总结
前言
前面我们已经初步学习了一些文件操作,今天来做一些补充。
一.文件的指定读写
我们通过改变pf指针的位置,可以实现指定位置的读写
1.fseek
int fseek ( FILE * stream, long offset, int origin);
stream 是指向 FILE 对象的指针,该FILE对象标识了流。
offset 是相对origin 的偏移量,以字节为单位。
origin是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾
我们通过读一个字符串来加深理解。
先用fgets写入一个字符串
int main()
{//打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//我们先写入一个字符串fputs("A nice boy", pf);//关闭文件fclose(pf);pf = NULL;
}
用fgetc读取第一个字符,
注意到使用了SEEK_END
用fseek调整指针位置到文件末,并偏移-2个单位
代码如下:
int main()
{//打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//从头开始读int ch = fgetc(pf);printf("%c ", ch);//调整pf位置为文件末,并且偏移-2个单位fseek(pf, -2, SEEK_END);//再次读,并打印ch = fgetc(pf);printf("%c ", ch);//关闭文件fclose(pf);pf = NULL;
}
图解:
因此程序输出结果为A 和 o
2.ftell
long int ftell ( FILE * stream);
用于返回当前文件指针位置相对于起始位置的偏移量。
我们在上文的代码用添加一个语句printf(“%ld”, ftell(pf));
打印的结果恰好为9.
3.rewind
void rewind( FILE * stream);
用于将文件指针返回文件的起始位置。
int main()
{//打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//从头开始读一个字符int ch = fgetc(pf);//调整pf位置为文件末,并且偏移-2个单位fseek(pf, -2, SEEK_END);//使文件指针返回起始位置rewind(pf);//计算偏移量并打印printf("%ld",ftell(pf));//关闭文件fclose(pf);pf = NULL;
}
打印后发现偏移量为0,即回到了起始位置。
二.文本文件和二进制文件
1.文本文件:
这类文件以文本的ASCII码形式存储在计算机中。 它是以"行"为基本结构的一种信息组织和存储方式。
2.二进制文件:
这类文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。
简单来说,
我们能直接看得懂的就是文本文件,
看不懂的就是二进制文件。
三.文件读取结束的判定
1.文本文件是否结束
- 使用fgetc判断返回值是否为EOF
- 或者使用fgets判断返回值是否为NULL
示例:
int main()
{int c;FILE* pf = fopen("test.txt", "r");if (!pf){perror("fopen");return 1;}//fgetc 当读取失败或者遇到文件结束的时候,返回EOFwhile ((c = fgetc(pf)) != EOF){putchar(c);}if (ferror(pf))//判断是否为读写时出错puts("I/O error when reading");else if (feof(pf))//判断是否为文件结尾puts("End of file reached successfully");
}
2.二进制文件是否结束
- fread判断返回值是否小于实际要读的个数
四.文件缓冲区
文件缓冲区是用以暂时存放读写期间的文件数据而在内存区预留的一定空间。
由于CPU 与 I/O 设备间速度不匹配。为了缓和 CPU 与 I/O 设备之间速度不匹配矛盾。文件缓冲区是用以暂时存放读写期间的文件数据而在内存区预留的一定空间。使用文件缓冲区可减少读取硬盘的次数。
怎样理解呢?
比方说,我们在一些游戏里会用金币兑换道具。
假如一个金币兑换一个道具,可以批量兑换
我们就没有必要每获得一个游戏币就兑换一次,
可以攒到一定数量一次性全换了。
这样就提高了效率。
VS2019缓冲区测试:
将字符串“abcdef”写入文件,
立刻打开文件,发现文件里没有内容
用fflush手动刷新缓冲区,再次打开文件,
文件里有了“abcdef”
#include<stdio.h>
#include<windows.h>
int main()
{//打开文件FILE* pf = fopen("test.txt", "w");//先把字符串放进缓冲区fputs("abcdef", pf);printf("睡眠十秒,已经写入数据,但是文件里没有内容\n");Sleep(10000);printf("刷新缓冲区\n");//刷新缓冲区,此时成功写入fflush(pf);printf("睡眠十秒,已经写入数据,文件里已经有内容了\n");Sleep(10000);//关闭文件fclose(pf);pf = NULL;
}
总结
以上就是今天要讲的内容啦。
C语言中的文件操作(二)相关推荐
- 【C 语言】文件操作 ( C 语言中的文件操作函数 | 磁盘与内存缓冲区 | 缓冲区工作机制 )
文章目录 一.C 语言中的文件操作函数 二.磁盘与内存缓冲区 三.缓冲区工作机制 一.C 语言中的文件操作函数 读取 文本文件 可以使用 getc , fgets , fscanf 函数 , 向 文本 ...
- 【C语言复习】C语言中的文件操作
C语言中的文件操作 写在前面 文件操作 什么是文件 文件的分类 文件名 文件的操作 文件指针 文件的打开和关闭 文件的顺序读写 文件的随机读写 fseek ftell rewind feof 写在前面 ...
- C语言中的文件操作那些事儿~~
是时候该学着操作文件了 什么是文件 文件种类 文件名 为什么要使用文件 文件的打开和关闭 文件的顺序读写 fgetc/fputc fgets/gputs fscanf/fprintf fread/fw ...
- SCL语言中的文件操作如何进行?
在SCL语言中,可以使用内置的文件操作函数来进行文件读写操作.下面是SCL语言中一些常用的文件操作函数: 1. `FOPEN`:打开文件. 2. `FCLOSE`:关闭文件. 3. `FREAD`:从 ...
- C语言详解文件操作(一):文件操作基础概念、按照字符、按照行块、按照格式化和随机位置读写文件
文章目录 一.文件操作基础概念 二.文件读写:按照字符方式读写 三.文件读写:按行和块读写 四.文件读写:格式化和随机位置 一.文件操作基础概念 C语言中的文件操作的好处: 一个文件通常是 ...
- go语言中的文件file操作
一.File文件操作 首先,file类是在os包中的,封装了底层的文件描述符和相关信息,同时封装了Read和Write的实现. 1.FileInfo接口 FileInfo接口中定义了File信息相关的 ...
- php 语言文件操作,php中目录文件操作详谈
php中目录文件操作详谈 首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,以下是小编整理的php中目录,文件操作详谈,欢迎来 ...
- r指引到文件夹_R语言中进行文件夹及文件夹内文件操作范例
rm(list=ls()) path = 'J:/lab/EX29 –在R语言中进行文件(夹)操作' setwd(path) cat("file A\n", file=" ...
- C语言字符串、文件操作常用操作函数,
C语言字符串常用操作函数 C语言字符串.文件操作常用操作函数 字符串输出 - puts() 字符串输入 - gets() 字符串比较 - strcmp() 字符串复制 - strcpy() 字符串连接 ...
- c语言中的文件类型只有文本文件一种,C语言中的文件类型只有哪两种_后端开发...
pycharm能干嘛_后端开发 PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳转.智能提示 ...
最新文章
- 控件包含代码块,因此无法修改控件集合
- 位置服务成为新经济亮点
- 转载:2016前端开发技术巡礼
- 团队作业9——第二次项目冲刺2(Beta阶段)
- android学习日记16--GridView(网格视图)
- STM32F10x 使用SysTick的延时函数
- 畅销书主编推出 MATLAB 春季班,限量优惠+送百G资料!
- oracle ora-16003,ORA-31600错误分析
- Spring中Aware的用法以及实现
- rgb红色范围_【论文阅读18】RGB-D Object-Oriented Semantic Mapping
- 解决Xshell无法连接虚拟机CentOS7问题
- otsu算法_【车牌识别算法】
- 美团服务器不稳定号码保护,美团打车号码保护功能,搭建用户安全的防火墙
- QT设置画笔/画刷颜色
- IoTP2PGate 两台物联网设备点对点通信快速实现方案
- python点击屏幕坐标获取_python+appium 点击屏幕坐标操作(qq头像为例)
- 掌控安全Web安全微专业笔记
- Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
- 智能卡卡发卡流程(收藏1)
- java通过反射调用有参数的方法
热门文章
- string类----猜词游戏
- 旧笔记本改linux桌面,在老旧笔记本电脑上成功安装xubuntu
- 高等代数第3版下 [丘维声 著] 2015年版_3折购书优惠码限时抢(人工智能类)
- Windows 缓冲区溢出与数据执行保护DEP
- PHP微信小程序用户昵称带表情符存储
- android 用户绑定银行卡,android 开发 怎么实现银行卡转账,绑定银行卡。 怎么实现评论回复功能。...
- 【无标题】 天气决策树
- 必过四级技巧方法总结大全
- walking机器人仿真教程-应用-多点导航结合闹铃播放实现移动闹钟
- java ee在线聊天室_基于jsp的网络聊天室-JavaEE实现网络聊天室 - java项目源码