- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C读写二进制文件【DOC精选】
2005-5-11
C++读写二进制文件
前几天写一个音频隐藏程序时碰到点问题,要读写二进制文件。一开始,我的程序看起来像是这样:
//...static string FILENAME = test.wav;
ifstream iStream;iStream.open(FILENAME.c_str());
char buffer[1024];while (iStream.read(buffer, sizeof(buffer) / sizeof(char))) {??? //...这里对读到的字节进行处理}
iStream.close();//...
可是循环几次后就“无故”跳出,文件根本没读完,可是程序码好像也没错。
为了测试二进制的读取,我特地写了个程序, 看起来像这样:
//...static string FILENAME = test.wav;
ifstream iStream;iStream.open(FILENAME.c_str());
char ch;while (iStream.get(ch)) {??? cout ch;}
iStream.close();//...
程序输出一部分字符后,就不再输出了,怎么回事?我把iostream以及fstreamr的读取、写入API都查了个便,好像没有什么发现,这段程序码
应该不会有问题的!
回忆以前写C代码的日子,fopen函数有个b参数,表示是二进制读写方式打开, 是否fstream也有二进制开启的参数? 一查MSDN果然如此, 这
个参数是 ios_base::binary。
马上行动,以上程序改成这样://...static string FILENAME = test.wav;
ifstream iStream;iStream.open(FILENAME.c_str(), ios_base::binary);?// 二进制模式
char ch;while (iStream.get(ch)) {???? cout ch;}
iStream.close();//...
哈哈,这回程序终于可以读取全部字节了,而且喇叭还嘟嘟地叫呢(二进制码当作字符输出,有些是空白,有的还会鸣喇叭(07h),呵呵)。
可是为什么?读出都是字节,都是无格式,打开时以二进制和默认方式打开有什么区别吗?
别急,上面解决了怎么读,下面让我们写一点东西吧!
#include iostream#include fstream#include string
using namespace std;
int main() {??? static string FILENAME = test.txt;
??? ofstream oStream;??? oStream.open(FILENAME.c_str());??// 标准(字符)模式打开哦
????oStream Hello World! endl;?// 写个换行符??? oStream Hello World!;
??? oStream.close();}
程序很简单,运行后产生test.txt文件,文件大小为26字节, 文件内容是这样:
Hello World!Hello World!
明明是24个字节嘛,呵呵,算上一个换行符 0dh 0ah 就是26个字符了。 用ultra edit打开看是这样:
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0D 0A48 65 6C 6C 6F 20 57 6F 72 6C 64 21
很清楚了吧!
下面我们把程序改成这样:
#include iostream#include fstream#include string
using namespace std;
int main() {??? static string FILENAME = test.txt;
??? ofstream oStream;??? oStream.open(FILENAME.c_str(), ios_base::binary);?// 二进制形式打开
??? oStream Hello World! endl;?// 写个换行符????oStream Hello World!;
??? oStream.close();}
运行后同样产生test.txt文件,咦!怎么少了一个字节(25个),打开后看是这样:
Hello World!Hello World!
用ultra edit 打开,是这样:
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0A48 65 6C 6
文档评论(0)