今天用fstream中的readsome去读取文件到buffer中。碰到了bug.
因为不知道文件的大小,担心超出buffer的容量或者不足本以为用readsome是可以实现的,不过调试发现readsome
总是返回0,什么都没有读到。后来查了一下下面的资料
1.由一个Bug看ifstream中read()与readsome()的区别
http://www.softat.org/viewthread.php?tid=59086
2.输入流的读取方法read()、readsome()比较
http://www.cnblogs.com/kb/archive/2005/08/15/215346.html
具体说说自己理解的原因
在内存快的时候readsome和read是有着相同的效果的,所以在msdn中的readsome的例子一般都是使用了内存中的流
来实现,可是在文件中,文件流读取的时候首先要把文件从硬盘读取到一个内存中的buffer1)中,每一次调用
read或者readsome是从内存中读取数据
read和readsome的不同点在于,read每次读完内存后,如果还能往输出内存buffer2(2表示和1的区别)中写入,还会更新
buffer1(从文件中读取后输入到buffer1中),而readsome仅仅对buffer1中的数据进行读取。并不会刷新buffer1
所以我们可以看出在fstream中readsome的使用时不合适的
我们因该使用read,对于readsome中返回的值,我们可以在read后用gcount函数获得。具体代码如下
ifstream doc_file_stream;
doc_file_stream.open(
"
c:/test.doc
"
,::std::ios::
in
);
char
buffer[
1024
];
do
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(doc_file_stream.bad())
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
break;
}
int read_num = 0;
doc_file_stream.read(buffer,1023);
read_num = doc_file_stream.gcount();
buffer[read_num] = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(read_num > 0)...{
cout << buffer ;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
else...{
break;
}
}
while
(
true
);
doc_file_stream.close();