96SEO 2026-02-19 22:37 0
用二进制方式打开文本存储的文件时也可以读取其中的内容因为文本文件本质上是存储字符类型数据。

这种方式读取文件内容我们需要用到string类型的方法
mytest(test.txt,ios::in|ios::binary);
ios::in是默认参数可以不写if(mytest.is_open()){cout打开文件失败endl;return
out((istreambuf_iteratorchar(mytest)),
out;out.assign((istreambuf_iteratorchar(mytest)),
}istreambuf_iterator会迭代访问文件内容读取完成后out会存贮整个文件的内容不需要一行一行读取
有时候我们也需要借由二进制模式处理一些非文本形式的简单数据比如数字数组。
这样的类型处理方法和上一节用结构体类型读写二进制文件很相似
mytest(nums.txt,ios::app|ios::binary);
numbers[]{10,15,20,30,55,67};mytest.write(reinterpret_castconst
char*(numbers),sizeof(numbers));}else{cout打开文件失败endl;return
}这里我们将一个整形数组以二进制形式写成了二进制文件这里的reinterpret_castconst
char*(numbers)是C指针类型的强制转换等同于(const
当我们想要读取时也用类似的办法处理。
值得注意的是如果我们知道数组的具体大小读取内容的任务又会简单许多
mytest(nums.txt,ios::in|ios::binary);if(mytest.is_open()){int
numbers[6];mytest.read(reinterpret_castchar*(numbers),
mytest(nums.txt,ios::in|ios::binary);
读取二进制文件if(mytest.is_open()){int
number;while(mytest.read((char*)number,sizeof(int))){coutnumber
在C语言中文件操作只有文件指针没有输入输出流的区别C是在C基础上将输入和输出分别封装成类ifstream类用于读文件ofstream用于写入文件。
但是C也保留了同时可以完成读写的类fstream。
它的使用方法与ifstream和ofstream完全相似如果我们想写如文件
if(mytest.is_open()){mytest这是另一个测试\n;}else{cout打开文件失败endl;return
out;while(mytestout){coutoutendl;}}else{cout打开文件失败endl;return
这是另一个测试我们以打开文本文件为例展示了fstream类用法操作二进制文件的方法也可以直接照搬ifstream和ofstream类。
但是fstream仍有一些细节需要我们注意fstream类的默认写参数是ios::out和ios::in至于具体执行那种操作会根据后面的代码进行确定。
写入文件时默认参数ios::out参数在没有文件时会创建文件但再有文件时是默认在文件最后写内容类似于ios::app。
fstream打开文件时还有一些参数可供使用
如果文件存在则截断文件重新写入内容类似于ofstream类的out模式。
通常情况下规范的编程通常在需要写文件的时候使用ofstream需要读的时候用ifstream即需要读又需要写的时候再使用fstream类。
在Linux平台下读和写有严格的权限控制为了方便管理我们调用的权限应当尽量少。
举个例子如果我们只需要读取文件那么即使我们有读写的权限也应当以只读方式打开文件。
之前我们介绍了文件的写入都是在文件的末尾或删除文件内容后再写入内容而读文件都是从文件的开头进行的。
这是因为读写文件都是从文件位置指针1处开始的我们之前的操作文件的方式文件指针都会在文件的最开始或最末尾。
实现文件的随机存取关键就在于调整文件指针所在位置。
tellg()fstream类两个成员函数都有且效果完全相同。
以写文件为例
if(mytest.is_open()){coutmytest.tellp()endl;mytest以写入文本为例\n;coutmytest.tellp()endl;}else{cout打开文件失败endl;return
mytest(test.doc,ios::app|ios::binary);
if(mytest.is_open()){coutmytest.tellg()endl;Student
child;while(mytest.read((char*)child,sizeof(child))){coutchild.name
child.sexendl;coutmytest.tellg()mytest.tellg()endl;}}else{cout打开文件失败endl;return
mytest.tellg()80可以看到在二进制文件中获取文件指针位置的方法与文本文件相同。
此外给大家说个冷知识使用ios::app打开文件除了可以在文件末尾追加内容也可以用于读取文件信息文件指针位置会根据任务自动进行调整。
不过为了规范编程尽量不要这样乱用。
fstream类在这里就不做展示了用法完全相同大家可以自行尝试。
文件的读和写都是在当前文件指针的位置往后进行的也就是说如果我们能够移动文件的位置指针就可以做到调整读写数据的位置。
C中为我们提供了这样的方法ifstream类使用seekg()成员函数移动文件指针ofstream类使用seekp()成员函数移动文件指针fstream类依旧是两者都可用效果相同。
if(mytest.is_open()){mytest.seekg(29);coutmytest.tellg()endl;string
当前位置为mytest.tellg()endl;}}else{cout打开文件失败endl;return
另外需要注意由于一个中文占3个字节因此我需要注意文件指针所在位置不能在某个中文字的内部。
假如使用mytest.seekg(28)输出内容就会出现异常。
student类与test.doc文化部在上节中已经定义和创建
使用读写模式打开二进制文件test.docif(mytest.is_open()){coutmytest.tellg()endl;Student
child;while(mytest.read((char*)child,sizeof(child))){coutchild.name
child.sexendl;coutmytest.tellg()mytest.tellg()endl;}//
清除文件状态流的标志mytest.clear();cout\n以上内容作为对比\nendl;mytest.seekg(-40,ios::cur);childStudent{WangWu,22,w};mytest.write((const
char*)child,sizeof(Student));mytest.seekg(ios::beg);while(mytest.read((char*)child,sizeof(child))){coutchild.name
child.sexendl;coutmytest.tellg()mytest.tellg()endl;}mytest.close();}else{cout打开文件失败endl;return
}在这段代码中大家可能会不理解mytest.clear()的用意在我们使用while循环读取文件的全部内容后failbite会被设置为true2这标志会让计算机认为文件遇到错误后面就无法正常对文件进行操作了。
使用clear函数可以清除这些标志后面才能继续操作文件。
可以看到我们虽然移动了文件指针在再定位置添加了内容但是原有的内容却是被覆盖掉了。
如果我们想要保留原来的内容需要将插入位置后面的内容向后移动若干单位实现方法类似于在数组中插入一个数。
本节我们继续学习了C操作文件的方法其中改变文件指针的位置是我们学习的重点。
在实际应用中我们经常会遇到需要从指定位置读取和写入内容的任务希望大家能够掌握本节内容。
在C中文件位置指针的指向就是文件中进行读取或写入操作时的初始位置。
除了我们用过的方法如is_open()外文件流还有很多比较实用的方法如使用eof()方法判断是否到达文件末尾使用good函数判断文件写入是否成功使用get函数按字符提取文本内容等在下一节还会具体介绍。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback