windows c++ 流读取文件长度 ios::in ios::binary
问题描述:
当用ios::in模式打开文件时,使用seekg和tellg读取文件的长度,将读取文件内容输出到控制台,发现乱码。
1 int _tmain(int argc, _TCHAR* argv[]) 2 { 3 using namespace std; 4 ifstream stream("F:\\WorkSpace\\StreamDemo\\Debug\\abc.txt", ios::in); 5 if(!stream) 6 cerr << "Open failed" << endl; 7 stream.seekg(0, ios::end); 8 int len = stream.tellg(); 9 stream.seekg(0, ios::beg); 10 char* buffer = new char[len]; 11 memset(buffer, '\0', len); 12 if(!stream.read(buffer, len)) 13 { 14 cout << "Read error:" << stream.rdstate() << endl; 15 } 16 cout.write(buffer, len); 17 stream.close(); 18 system("pause"); 19 return 0; 20 }
abc.txt文件内容:
运行结果如下:
读出结果错误,输出到控制台文件,最后有两个乱码。
而将ios::in改为ios::binary之后,运行结果如下
单步调试发现,得到的len为8,而文件中的内容本以为是a\naaa\n,应该是6个。
经调查,发现在windows的文本文件中换行是两个字符\r\n,所以文件中的内容为a\r\naaa\r\n这8个字符。
而用ios::in方式读入的文件为a\naaa\n,所以len超过文件末尾。
而用ios::binary方式读入的文件为a\r\naaa\r\n,得到正确的结果。
又改使用了get()来获得结果,依然发现得到的结果是a\naaa\n。
得出以下结论:
1. 以ios::in方式读入的文件,/r/n读取内存之后会被认为是同一个字符/n,/n写入文件变成/r/n
2. 以ios::binary方式读取的文件,/r/n读取内存之后会被认为是两个字符,写入文件时,必须把换行符写入为/r/n,否则起不到换行效果。
3. 上述seekg和tellg的方式,用作计算ios::in方式打开的文件长度,实际值大于文件读入之后的长度。不能用read读取文件,可用get或getline代替。
尚没有找到简单完美的方式解决流读取文件大小的问题,如果你有好的方法,请回复。
转载于:https://www.cnblogs.com/chjtao/p/4670556.html
windows c++ 流读取文件长度 ios::in ios::binary相关推荐
- Windows PC、 Linux、 Android、 iOS多平台支持H5无插件播放RTSP摄像机解决方案
Windows PC. Linux. Android. iOS多平台支持H5无插件播放RTSP摄像机解决方案 需求分析 视频流媒体监控行业已经进入互联网时代,浏览器承载了绝大多数的互联网访问流量,目前 ...
- 「项目实战」一文读懂思科网络设备IOS系统
今天给大家带来的小知识是一文读懂思科的IOS系统,相信大家都有了解,但是今天呢给大家把完整的流程梳理出来,这样有助于大家记笔记哦! IOS是被用来传送网络服务并启动网络应用的.Cisco路由器的IOS ...
- 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信
一文读懂Android/iOS手机如何通过音频接口与外设通信 更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦: 目录 一文读懂 ...
- Windows PC、Linux、Android、iOS 跨平台视频云客户端 QML 开发解决方案
Windows PC.Linux.Android.iOS 跨平台视频云客户端 QML 开发解决方案 SkeyeARS (Skeye Video Augmented Reality System) 全景 ...
- 转 : Squareup刷卡器,音频读卡识别android/iOS源码API
转 : Squareup刷卡器,音频读卡识别android/iOS源码API 相信很多人已经见过squareup的读卡器了,银行磁卡在该读卡器上一刷,则能从手机中获取银行卡磁道的信息. Squa ...
- ofstream之ios::ate,ios::app,ios::in,ios::out
ofstream流,以ios::app打开(或者"ios::app|ios::out"),如果没有文件,那么生成空文件:如果有文件,那么在文件尾追加. 以ios::app|ios: ...
- iOS:iOS开发非常全的三方库、插件、大牛博客等等
iOS开发非常全的三方库.插件.大牛博客等等 github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章 ...
- iOS开发--iOS及Mac开源项目和学习资料
文/零距离仰望星空(简书作者) 原文链接:http://www.jianshu.com/p/f6cdbc8192ba 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者". ...
- ios::ate ios::app ios::out ios::in ios::trunc ios::binary(组合总结)
一.情况1 [file1会被截断] ofstream out("file1"); ofstream out("file1", ofstream::out); o ...
- Xcode中的iOS模拟器(iOS Simulator)的介绍和使用心得
[整理]Xcode中的iOS模拟器(iOS Simulator)的介绍和使用心得 2012-12-12 10:45:40| 分类: Apple|字号 订阅 原文链接: http://www.crif ...
最新文章
- Chrome JSON格式化插件
- IOS开发基础之团购案例17-xib和UITableView两种方式实现
- javaScript如何监听浏览器关闭事件
- 人生永无止境的意思是什么_励志人生:生活不会给任何脆弱鼓掌。
- 浏览器截图插件什么的弱爆了
- 交换机连接控制器_DELL MD3200I存储单双控制器的自由切换
- linux django web,Flask Django web实战
- Linux MySQL单实例源码编译安装5.6
- Linux中的Java类,Java基础入门学习-Java中类的属性
- 常用标准库_Python入门(五):常用标准库sys和os
- 盈建科中地震波_[GMS][地震波][选波]YJK地震波反应谱分析与地震波选取
- imagej得到灰度图数据_用ImageJ处理空间成像数据
- CAj格式文件打开方法
- 整除光棍 — C语言【模拟手算除法(附过程图解)】
- 如何清理 C 盘空间
- 李航统计学习方法笔记——泛化误差上界
- Oracle错误12154的解决方法
- MySQL之分库分表
- 玩转ChatGPT:Auto-GPT项目部署与测评
- 复现Dense Extreme Inception Network(pytorch)