C++学习笔记(二)

原创 2007年10月10日 09:34:00

        在学习最新的C++标准过程中会碰到很多新问题,这些问题有时候很难理解为什么会发生。更奇怪的是,似乎跟开发工具有关。如下面这个在VS2005下的例子:

 

WORD iStatus;
ifstream ifs;
    
if(IsExit(szPRLFile,0)!=0)
...{
    AfxMessageBox(
"file is not exit!");
    
return -1;
}

std::locale::
global(std::locale("")); // 添加的语句1
ifs.open(szPRLFile,ios::in|ios::binary);// 文件名如果有中文此函数会失败
ifs.imbue(std::locale("C"));   // 添加的语句2
char data[PRLMAXSIZE]=...{0};    
ifs.read(data,
sizeof(data));    
int iTotalSize=ifs.gcount();// 该函数读取的数据为0;解决方法在调用open的前后添加上面两条语句改变
ifs.close();

       上面这段代码如果将“添加的语句1”和“添加的语句2”注释,在VS2005下编译没有问题,但是运行问题就来了。可以在运行到ifs.read(data,sizeof(data))的时候查看data的值,为空。同样,运行到下一句的时候iTotalSize为0。只有将那两句的注释去掉,才能得到我们想要的结果。

        同样的代码我在Dev-C++4.9.9.2上运行正常。据说还是同样的代码在VS2003下正常运行。看来是VS2005本身的问题了。一位大侠给出了下面的分析:

VC8 中fstream的陷阱 

         VC8的STL部分相对以前版本作了相当大的改进,但其中一个更改更象一个bug。它的file stream 类(含ifstream和ofstream)在open时会自动将文件名转换成Unicode,但转换时会使用STL库的默认locale(C locale)来做 page code,这在非英语语言操作系统上会导致文件名错误,从而无法打开文件。解决的办法是在程序初始化时(或在执行open之前),将STL的默认locale设置成系统的locale, 具体方法是加入语句 std::local::global(std::locale(“”)); 即STL需要执行一个初始化过程才能在非英语操作系统上正确运行。Locale会影响所有stream的格式化操作,比如设置了中文操作系统的本地locale后,数字会被格式化成逗号分割的三位组(形如123,456,78).这对于需要再从这些格式化后的字符串恢复成数字的操作来说是不合适的,使用C locale则不会出现这种问题。要在stream open以后再修改locale,STL提供了stream::imbue操作。可以使用stream::imbue(std::locale(“C”))来将stream的locale再修改回c locale。

kafka学习笔记(2)

kafka的经典问题有这几个: 1.kafka节点之间如何备份? 2.kafka消息是否会丢失?为什么? 3.kafka最合理的配置是什么? 4.kafka的leader选举机制是什么? 5...
  • m0_37587447
  • m0_37587447
  • 2017年11月21日 15:37
  • 21

PCIe 学习笔记(二)

pci note 2 -v0.1 2014.11.18 *** draft  本文继续pci note 1, 介绍pci_create_root_bus函数, 内核版本为3.18-rc1 ...
  • scarecrow_byr
  • scarecrow_byr
  • 2014年12月01日 22:19
  • 1721

C++ Primer(第五版) 学习笔记

C++语言基础: 1. C++11增加了long long 类型,表示最小尺寸为64的整数。 2. 浮点数运算使用double,通常运算速度更快。 3. 超过int容量时使用long long类型,无...
  • zxh2075
  • zxh2075
  • 2016年10月25日 15:56
  • 406

网络编程学习笔记整理(二)

摘录笔记 《TCP/IP高效编程 改善网络程序的44个技巧》socket的创建函数int socket (int domain,int type, int protocol)参数说明protocol需...
  • stecdeng
  • stecdeng
  • 2017年02月23日 14:47
  • 187

C++学习笔记(一)

C++学习笔记(一)
  • zaibianchange
  • zaibianchange
  • 2016年10月26日 22:28
  • 95

密码学学习笔记

1.流密码每次加密数据流的一位或一个字节,分组密码是将一个明文分组作为整体加密并且通常得到的是与明文等长的密文分组。 2.现在使用的大多数对称分组加密算法都是基于Feistel分组密码结构的。...
  • u011130578
  • u011130578
  • 2015年12月22日 13:57
  • 794

C++学习笔记-函数

局部变量: 形参和函数体内定义的变量 局部变量又分为自动变量和局部静态变量 注意,局部静态变量在程序的执行路径第一次经过对象定义语句时初始化,直到程序终止才被销毁。所以一个简单的应用是,用局部静态变量...
  • jo_lan
  • jo_lan
  • 2015年12月18日 18:57
  • 240

Unity3D之Mecanim动画系统学习笔记(三):Animation View

动画组件之间的关系 我们先看一张图: 这里我们可以看到,我们在GameObject之上绑定的Animator组件是控制模型进行动画播放的。 而其属性Controller则对应一个Anim...
  • cbbbc
  • cbbbc
  • 2017年02月19日 18:20
  • 317

C++学习笔记(一) 补充篇 基础语法 — 参考慕课网 值得推荐!

2016年8月23日 前段时间真的是恍然大悟,书看错了,我看的 C++ prime plus看的真心的难受,也不知道这本书到底在写什么。 2016年8月28日 一晃又过了4-5天,真快啊,发现那...
  • David_Han008
  • David_Han008
  • 2016年08月25日 16:47
  • 2935

Netty4学习笔记(一) 基础篇

在开始学习Netty之前,我们先对Unix系统常用的I/O模型进行介绍,然后对Java的I/O历史演进历史进行简单的说明。Linux 网络I/O模型简介Linux内核将所有外部设备都看做一个文件来操作...
  • FX_SKY
  • FX_SKY
  • 2016年03月15日 01:38
  • 6217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++学习笔记(二)
举报原因:
原因补充:

(最多只允许输入30个字)