视频推广网站,宣传类的网站有哪些,中国建设银行学习网站,html5个人主页文件操作#xff08;2#xff09; 1.二进制模式读取文本文件2.使用二进制读写其他类型内容3.fstream类4.文件的随机存取文件指针的获取文件指针的移动 1.二进制模式读取文本文件
用二进制方式打开文本存储的文件时#xff0c;也可以读取其中的内容#xff0c;因为文本文件… 文件操作2 1.二进制模式读取文本文件2.使用二进制读写其他类型内容3.fstream类4.文件的随机存取文件指针的获取文件指针的移动 1.二进制模式读取文本文件
用二进制方式打开文本存储的文件时也可以读取其中的内容因为文本文件本质上是存储字符类型数据。这种方式读取文件内容我们需要用到string类型的方法
int main()
{ifstream mytest(test.txt,ios::in|ios::binary); // ios::in是默认参数可以不写if(mytest.is_open()){cout打开文件失败endl;return 0;}// 二进制文件读取后需要用正确的接收格式接收// string out((istreambuf_iteratorchar(mytest)), (istreambuf_iteratorchar())) // 直接使用string的构造函数对out进行赋值string out;out.assign((istreambuf_iteratorchar(mytest)), (istreambuf_iteratorchar())); // 使用assign函数赋值coutout;// 关闭文件mytest.close();
}istreambuf_iterator会迭代访问文件内容读取完成后out会存贮整个文件的内容不需要一行一行读取
2.使用二进制读写其他类型内容
有时候我们也需要借由二进制模式处理一些非文本形式的简单数据比如数字数组。这样的类型处理方法和上一节用结构体类型读写二进制文件很相似
int main()
{ofstream mytest(nums.txt,ios::app|ios::binary); // 读取二进制文件if(mytest.is_open()){// 二进制文件读取后需要用正确的接收格式接收int numbers[]{10,15,20,30,55,67};mytest.write(reinterpret_castconst char*(numbers),sizeof(numbers));}else{cout打开文件失败endl;return 0;}// 关闭文件mytest.close();
}这里我们将一个整形数组以二进制形式写成了二进制文件这里的reinterpret_castconst char*(numbers)是C指针类型的强制转换等同于(const char*)numbers。 当我们想要读取时也用类似的办法处理。值得注意的是如果我们知道数组的具体大小读取内容的任务又会简单许多
int main()
{ifstream mytest(nums.txt,ios::in|ios::binary);if(mytest.is_open()){int numbers[6];mytest.read(reinterpret_castchar*(numbers), sizeof(numbers));// 查看内容是否正确存储到整形数组里for(int i0;i5;i){coutnumbers[i] ;}}else{cout打开文件失败endl;return 0;}// 关闭文件mytest.close();
}
// 输出为10 15 20 30 55 67 如果换成长度已知的结构体数组也可以这样处理。 如果我们不知道数组的具体长度也可以一个一个读出文件的存储内容 int main()
{ifstream mytest(nums.txt,ios::in|ios::binary); // 读取二进制文件if(mytest.is_open()){int number;while(mytest.read((char*)number,sizeof(int))){coutnumber ;}}else{cout打开文件失败endl;return 0;}// 关闭文件mytest.close();
}输出结果同上例一样。
3.fstream类
在C语言中文件操作只有文件指针没有输入输出流的区别C是在C基础上将输入和输出分别封装成类ifstream类用于读文件ofstream用于写入文件。但是C也保留了同时可以完成读写的类fstream。它的使用方法与ifstream和ofstream完全相似如果我们想写如文件
int main()
{fstream mytest(test.txt); if(mytest.is_open()){mytest这是另一个测试\n;}else{cout打开文件失败endl;return 0;}// 关闭文件mytest.close();
}如果我们想读取文件
int main()
{fstream mytest(test.txt); if(mytest.is_open()){string out;while(mytestout){coutoutendl;}}else{cout打开文件失败endl;return 0;}// 关闭文件mytest.close();
}
// 输出为这是一个测试
// 我们尝试连续输入内容
// 继续测试这是一个测试
// 我们尝试连续输入内容
// 这是一个测试
// 我们尝试连续输入内容
// 这是另一个测试我们以打开文本文件为例展示了fstream类用法操作二进制文件的方法也可以直接照搬ifstream和ofstream类。但是fstream仍有一些细节需要我们注意fstream类的默认写参数是ios::out和ios::in至于具体执行那种操作会根据后面的代码进行确定。写入文件时默认参数ios::out参数在没有文件时会创建文件但再有文件时是默认在文件最后写内容类似于ios::app。fstream打开文件时还有一些参数可供使用 ios::ate 以定位到文件末尾的方式打开文件 ios::in|ios::out 以读写方式打开文件 ios::out|ios::truct 如果文件存在则截断文件重新写入内容类似于ofstream类的out模式。 通常情况下规范的编程通常在需要写文件的时候使用ofstream需要读的时候用ifstream即需要读又需要写的时候再使用fstream类。在Linux平台下读和写有严格的权限控制为了方便管理我们调用的权限应当尽量少。举个例子如果我们只需要读取文件那么即使我们有读写的权限也应当以只读方式打开文件。
4.文件的随机存取
之前我们介绍了文件的写入都是在文件的末尾或删除文件内容后再写入内容而读文件都是从文件的开头进行的。这是因为读写文件都是从文件位置指针1处开始的我们之前的操作文件的方式文件指针都会在文件的最开始或最末尾。实现文件的随机存取关键就在于调整文件指针所在位置。
文件指针的获取
获取文件指针位置的方法输入流ofstream类为成员函数是 tellp()输出流ifstream类为成员函数是 tellg()fstream类两个成员函数都有且效果完全相同。以写文件为例
int main()
{ofstream mytest(test1.txt,ios::app); if(mytest.is_open()){coutmytest.tellp()endl;mytest以写入文本为例\n;coutmytest.tellp()endl;}else{cout打开文件失败endl;return 0;}// 关闭文件mytest.close();
}
// 输出为0
// 22读取文件同时获取文件指针的方法与写入相同
// Student结构体上节内容中有所定义
int main()
{ifstream 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.age child.sexendl;coutmytest.tellg()mytest.tellg()endl;}}else{cout打开文件失败endl;return 0;}// 关闭文件mytest.close();
}
// 输出为0
// ZhangSan 15 m
// mytest.tellg()40
// LiSi 20 m
// mytest.tellg()80可以看到在二进制文件中获取文件指针位置的方法与文本文件相同。此外给大家说个冷知识使用ios::app打开文件除了可以在文件末尾追加内容也可以用于读取文件信息文件指针位置会根据任务自动进行调整。不过为了规范编程尽量不要这样乱用。 fstream类在这里就不做展示了用法完全相同大家可以自行尝试。
PS文件只有一个位置指针并非同时拥有读指针和写指针。
文件指针的移动
文件的读和写都是在当前文件指针的位置往后进行的也就是说如果我们能够移动文件的位置指针就可以做到调整读写数据的位置。C中为我们提供了这样的方法ifstream类使用seekg()成员函数移动文件指针ofstream类使用seekp()成员函数移动文件指针fstream类依旧是两者都可用效果相同。 seekp和seekg有两个常用的重载第一种为 seekg(ios::beg) 将文件指针移动到0位置 seekg(ios::end) 将文件指针移动到末尾 seekg(128) 将文件指针移动到指定位置这里指定文件指针移动到128位置 注将seekg换成seekp效果完全类似 我们看个例子
int main()
{ifstream mytest(test.txt,ios::in); if(mytest.is_open()){mytest.seekg(29);coutmytest.tellg()endl;string out;while(mytestout){coutout 当前位置为mytest.tellg()endl;}}else{cout打开文件失败endl;return 0;}mytest.close();
}输出结果为 另外需要注意由于一个中文占3个字节因此我需要注意文件指针所在位置不能在某个中文字的内部。假如使用mytest.seekg(28)输出内容就会出现异常。 另一种常用seek方法的重载有两个参数 seekg(10,ios::beg) 文件指针从0位置开始向后移动10字节 seekg(-3,ios::end) 文件指针从末尾开始向前移动3字节 seekg(5,ios::cur) 文件指针从当前位置开始向后移动5字节 注将seekg换成seekp效果完全类似 还是看个例子
// student类与test.doc文化部在上节中已经定义和创建
int main()
{fstream mytest(test.doc,ios::in | ios::out | ios::binary ); // 使用读写模式打开二进制文件test.docif(mytest.is_open()){coutmytest.tellg()endl;Student child;while(mytest.read((char*)child,sizeof(child))){coutchild.name child.age 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.age child.sexendl;coutmytest.tellg()mytest.tellg()endl;}mytest.close();}else{cout打开文件失败endl;return 0;}
}在这段代码中大家可能会不理解mytest.clear()的用意在我们使用while循环读取文件的全部内容后failbite会被设置为true2这标志会让计算机认为文件遇到错误后面就无法正常对文件进行操作了。使用clear函数可以清除这些标志后面才能继续操作文件。 输出是这样的 可以看到我们虽然移动了文件指针在再定位置添加了内容但是原有的内容却是被覆盖掉了。如果我们想要保留原来的内容需要将插入位置后面的内容向后移动若干单位实现方法类似于在数组中插入一个数。
本节我们继续学习了C操作文件的方法其中改变文件指针的位置是我们学习的重点。在实际应用中我们经常会遇到需要从指定位置读取和写入内容的任务希望大家能够掌握本节内容。 在C中文件位置指针的指向就是文件中进行读取或写入操作时的初始位置。 ↩︎ 除了我们用过的方法如is_open()外文件流还有很多比较实用的方法如使用eof()方法判断是否到达文件末尾使用good函数判断文件写入是否成功使用get函数按字符提取文本内容等在下一节还会具体介绍。 ↩︎
文章转载自: http://www.morning.ghxkm.cn.gov.cn.ghxkm.cn http://www.morning.knczz.cn.gov.cn.knczz.cn http://www.morning.tsmxh.cn.gov.cn.tsmxh.cn http://www.morning.bangaw.cn.gov.cn.bangaw.cn http://www.morning.spwm.cn.gov.cn.spwm.cn http://www.morning.rdnjc.cn.gov.cn.rdnjc.cn http://www.morning.mtbth.cn.gov.cn.mtbth.cn http://www.morning.rsnd.cn.gov.cn.rsnd.cn http://www.morning.wgzzj.cn.gov.cn.wgzzj.cn http://www.morning.qxycf.cn.gov.cn.qxycf.cn http://www.morning.rrqbm.cn.gov.cn.rrqbm.cn http://www.morning.gcdzp.cn.gov.cn.gcdzp.cn http://www.morning.jcxgr.cn.gov.cn.jcxgr.cn http://www.morning.fxxmj.cn.gov.cn.fxxmj.cn http://www.morning.dkqr.cn.gov.cn.dkqr.cn http://www.morning.spsqr.cn.gov.cn.spsqr.cn http://www.morning.zthln.cn.gov.cn.zthln.cn http://www.morning.nfzw.cn.gov.cn.nfzw.cn http://www.morning.dkbsq.cn.gov.cn.dkbsq.cn http://www.morning.ptmsk.cn.gov.cn.ptmsk.cn http://www.morning.kkdbz.cn.gov.cn.kkdbz.cn http://www.morning.knczz.cn.gov.cn.knczz.cn http://www.morning.fcftj.cn.gov.cn.fcftj.cn http://www.morning.vnuwdy.cn.gov.cn.vnuwdy.cn http://www.morning.qsctt.cn.gov.cn.qsctt.cn http://www.morning.wqmyh.cn.gov.cn.wqmyh.cn http://www.morning.wrysm.cn.gov.cn.wrysm.cn http://www.morning.dqdss.cn.gov.cn.dqdss.cn http://www.morning.ktpzb.cn.gov.cn.ktpzb.cn http://www.morning.rnzgf.cn.gov.cn.rnzgf.cn http://www.morning.ndngj.cn.gov.cn.ndngj.cn http://www.morning.rswtz.cn.gov.cn.rswtz.cn http://www.morning.rbgqn.cn.gov.cn.rbgqn.cn http://www.morning.mswkd.cn.gov.cn.mswkd.cn http://www.morning.ybqlb.cn.gov.cn.ybqlb.cn http://www.morning.kqkmx.cn.gov.cn.kqkmx.cn http://www.morning.wzyfk.cn.gov.cn.wzyfk.cn http://www.morning.zbqry.cn.gov.cn.zbqry.cn http://www.morning.ktnmg.cn.gov.cn.ktnmg.cn http://www.morning.gfpyy.cn.gov.cn.gfpyy.cn http://www.morning.wkpfm.cn.gov.cn.wkpfm.cn http://www.morning.xdpjs.cn.gov.cn.xdpjs.cn http://www.morning.dgckn.cn.gov.cn.dgckn.cn http://www.morning.qlpq.cn.gov.cn.qlpq.cn http://www.morning.ztjhz.cn.gov.cn.ztjhz.cn http://www.morning.rshijie.com.gov.cn.rshijie.com http://www.morning.qhfdl.cn.gov.cn.qhfdl.cn http://www.morning.frfnb.cn.gov.cn.frfnb.cn http://www.morning.zbnkt.cn.gov.cn.zbnkt.cn http://www.morning.yxlpj.cn.gov.cn.yxlpj.cn http://www.morning.kfldw.cn.gov.cn.kfldw.cn http://www.morning.sgbss.cn.gov.cn.sgbss.cn http://www.morning.gyfhk.cn.gov.cn.gyfhk.cn http://www.morning.frtt.cn.gov.cn.frtt.cn http://www.morning.nmkfy.cn.gov.cn.nmkfy.cn http://www.morning.bpncd.cn.gov.cn.bpncd.cn http://www.morning.gkmwx.cn.gov.cn.gkmwx.cn http://www.morning.lqlhw.cn.gov.cn.lqlhw.cn http://www.morning.bangaw.cn.gov.cn.bangaw.cn http://www.morning.pprxs.cn.gov.cn.pprxs.cn http://www.morning.kyjyt.cn.gov.cn.kyjyt.cn http://www.morning.kcxtz.cn.gov.cn.kcxtz.cn http://www.morning.jqhrk.cn.gov.cn.jqhrk.cn http://www.morning.zrmxp.cn.gov.cn.zrmxp.cn http://www.morning.pwxkn.cn.gov.cn.pwxkn.cn http://www.morning.yhpl.cn.gov.cn.yhpl.cn http://www.morning.ftmzy.cn.gov.cn.ftmzy.cn http://www.morning.pwrkl.cn.gov.cn.pwrkl.cn http://www.morning.yymlk.cn.gov.cn.yymlk.cn http://www.morning.newfeiya.com.cn.gov.cn.newfeiya.com.cn http://www.morning.coffeedelsol.com.gov.cn.coffeedelsol.com http://www.morning.jhzct.cn.gov.cn.jhzct.cn http://www.morning.xflzm.cn.gov.cn.xflzm.cn http://www.morning.rlbg.cn.gov.cn.rlbg.cn http://www.morning.xkjrs.cn.gov.cn.xkjrs.cn http://www.morning.nrmyj.cn.gov.cn.nrmyj.cn http://www.morning.ytrbq.cn.gov.cn.ytrbq.cn http://www.morning.ysllp.cn.gov.cn.ysllp.cn http://www.morning.xtgzp.cn.gov.cn.xtgzp.cn http://www.morning.ztnmc.cn.gov.cn.ztnmc.cn