问题描述:

  当用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相关推荐

  1. Windows PC、 Linux、 Android、 iOS多平台支持H5无插件播放RTSP摄像机解决方案

    Windows PC. Linux. Android. iOS多平台支持H5无插件播放RTSP摄像机解决方案 需求分析 视频流媒体监控行业已经进入互联网时代,浏览器承载了绝大多数的互联网访问流量,目前 ...

  2. 「项目实战」一文读懂思科网络设备IOS系统

    今天给大家带来的小知识是一文读懂思科的IOS系统,相信大家都有了解,但是今天呢给大家把完整的流程梳理出来,这样有助于大家记笔记哦! IOS是被用来传送网络服务并启动网络应用的.Cisco路由器的IOS ...

  3. 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信

    一文读懂Android/iOS手机如何通过音频接口与外设通信 更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦: 目录 一文读懂 ...

  4. Windows PC、Linux、Android、iOS 跨平台视频云客户端 QML 开发解决方案

    Windows PC.Linux.Android.iOS 跨平台视频云客户端 QML 开发解决方案 SkeyeARS (Skeye Video Augmented Reality System) 全景 ...

  5. 转 : Squareup刷卡器,音频读卡识别android/iOS源码API

    转  :   Squareup刷卡器,音频读卡识别android/iOS源码API 相信很多人已经见过squareup的读卡器了,银行磁卡在该读卡器上一刷,则能从手机中获取银行卡磁道的信息. Squa ...

  6. ofstream之ios::ate,ios::app,ios::in,ios::out

    ofstream流,以ios::app打开(或者"ios::app|ios::out"),如果没有文件,那么生成空文件:如果有文件,那么在文件尾追加. 以ios::app|ios: ...

  7. iOS:iOS开发非常全的三方库、插件、大牛博客等等

    iOS开发非常全的三方库.插件.大牛博客等等 github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章 ...

  8. iOS开发--iOS及Mac开源项目和学习资料

    文/零距离仰望星空(简书作者) 原文链接:http://www.jianshu.com/p/f6cdbc8192ba 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者". ...

  9. ios::ate ios::app ios::out ios::in ios::trunc ios::binary(组合总结)

    一.情况1 [file1会被截断] ofstream out("file1"); ofstream out("file1", ofstream::out); o ...

  10. Xcode中的iOS模拟器(iOS Simulator)的介绍和使用心得

    [整理]Xcode中的iOS模拟器(iOS Simulator)的介绍和使用心得 2012-12-12 10:45:40|  分类: Apple|字号 订阅 原文链接: http://www.crif ...

最新文章

  1. Chrome JSON格式化插件
  2. IOS开发基础之团购案例17-xib和UITableView两种方式实现
  3. javaScript如何监听浏览器关闭事件
  4. 人生永无止境的意思是什么_励志人生:生活不会给任何脆弱鼓掌。
  5. 浏览器截图插件什么的弱爆了
  6. 交换机连接控制器_DELL MD3200I存储单双控制器的自由切换
  7. linux django web,Flask Django web实战
  8. Linux MySQL单实例源码编译安装5.6
  9. Linux中的Java类,Java基础入门学习-Java中类的属性
  10. 常用标准库_Python入门(五):常用标准库sys和os
  11. 盈建科中地震波_[GMS][地震波][选波]YJK地震波反应谱分析与地震波选取
  12. imagej得到灰度图数据_用ImageJ处理空间成像数据
  13. CAj格式文件打开方法
  14. 整除光棍 — C语言【模拟手算除法(附过程图解)】
  15. 如何清理 C 盘空间
  16. 李航统计学习方法笔记——泛化误差上界
  17. Oracle错误12154的解决方法
  18. MySQL之分库分表
  19. 玩转ChatGPT:Auto-GPT项目部署与测评
  20. 复现Dense Extreme Inception Network(pytorch)

热门文章

  1. C++ 遍历 iterator has no member named
  2. 区块链 使用xbench测试xuperchain 教程
  3. Ajax技术复习---狂神笔记
  4. php之mysql(数据库的连接)出错问题及解决,cmd操作数据库失败
  5. 十二、Object类
  6. 血的教训!千万别在生产使用这些 redis 指令
  7. Mahout 安装配置及一个简单测试
  8. Kafka 安装部署、集群启动、命令行操作 与 可视化工具 Kafka Tool
  9. php工作要求,PHP工作岗位要求
  10. java截取utf8字符串_java中常用的字符串的截取方法