当前位置:首页 > 操作系统 > Windows

windows c++ 流读取文件长度 ios::in ios::binary

问题描述:

  当用ios::in模式打开文件时,使用seekg和tellg读取文件的长度,将读取文件内容输出到控制台,发现乱码。

            <span> 1</span>
            <span>int</span> _tmain(<span>int</span> argc, _TCHAR*<span> argv[])
</span><span> 2</span><span>{
</span><span> 3</span><span>using</span><span>namespace</span><span> std;
</span><span> 4</span>     ifstream stream(<span>"</span><span>F:WorkSpaceStreamDemoDebugabc.txt</span><span>"</span>, ios::<span>in</span><span>);
</span><span> 5</span><span>if</span>(!<span>stream)
</span><span> 6</span>         cerr << <span>"</span><span>Open failed</span><span>"</span> <<<span> endl;
</span><span> 7</span>     stream.seekg(<span>0</span><span>, ios::end);
</span><span> 8</span><span>int</span> len =<span> stream.tellg();
</span><span> 9</span>     stream.seekg(<span>0</span><span>, ios::beg);
</span><span>10</span><span>char</span>* buffer = <span>new</span><span>char</span><span>[len];
</span><span>11</span>     memset(buffer, <span>‘</span><span></span><span>‘</span><span>, len);
</span><span>12</span><span>if</span>(!<span>stream.read(buffer, len))
</span><span>13</span><span>    {
</span><span>14</span>         cout << <span>"</span><span>Read error:</span><span>"</span> << stream.rdstate() <<<span> endl;
</span><span>15</span><span>    }
</span><span>16</span><span>    cout.write(buffer, len);
</span><span>17</span><span>    stream.close();
</span><span>18</span>     system(<span>"</span><span>pause</span><span>"</span><span>);
</span><span>19</span><span>return</span><span>0</span><span>;
</span><span>20</span> }

abc.txt文件内容:

技术分享

运行结果如下:

技术分享

读出结果错误,输出到控制台文件,最后有两个乱码。

而将ios::in改为ios::binary之后,运行结果如下

技术分享

单步调试发现,得到的len为8,而文件中的内容本以为是a aaa ,应该是6个。

经调查,发现在windows的文本文件中换行是两个字符 ,所以文件中的内容为a aaa 这8个字符。

而用ios::in方式读入的文件为a aaa ,所以len超过文件末尾。

而用ios::binary方式读入的文件为a aaa ,得到正确的结果。

又改使用了get()来获得结果,依然发现得到的结果是a aaa 。

 

得出以下结论:

1. 以ios::in方式读入的文件,/r/n读取内存之后会被认为是同一个字符/n,/n写入文件变成/r/n

2. 以ios::binary方式读取的文件,/r/n读取内存之后会被认为是两个字符,写入文件时,必须把换行符写入为/r/n,否则起不到换行效果。

3. 上述seekg和tellg的方式,用作计算ios::in方式打开的文件长度,实际值大于文件读入之后的长度。不能用read读取文件,可用get或getline代替。

 

尚没有找到简单完美的方式解决流读取文件大小的问题,如果你好的方法,请回复。

原文:http://www.cnblogs.com/chjtao/p/4670556.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐