读书人

文件流的有关问题

发布时间: 2012-03-17 19:06:28 作者: rapoo

文件流的问题
我读文件,但不想设置缓冲区的大小,
即不想写类似以下的代码
ifstream if(...);
...
if.read(buf,bufsize);
我用copy(istream_iterator <char> (if),istream_iterator <char> (),str);
但是似乎把文件里的换行符忽略了,
于是只有
while(getline(if,buf))
{
str+=buf;
str+= "\n ";
}
但是这样的代码又慢又难看,敢问各位,这个问题怎么解决?


[解决办法]
istreambuf_iterator?
[解决办法]
是的,istreambuf_iterator,可看effective stl item29
[解决办法]
获取文件内容时使用 istream_iterator 和 istreambuf_iterator 的区别

// 以下代码在VC++6.0和GCC3.4.2上编译测试通过
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <iostream>
#include <iomanip>
using namespace std;

int main( void )
{
const char* filename = "D:\\test.txt ";
fstream file1( filename, ios_base::in );
fstream file2( filename, ios_base::in );
fstream file3( filename, ios_base::binary|ios_base::in );

vector <char> v1;
istream_iterator <char> iter_f1( file1 );
copy( iter_f1, istream_iterator <char> (), back_inserter(v1) );

vector <char> v2;
istreambuf_iterator <char> iter_f2( file2 );
copy( iter_f2, istreambuf_iterator <char> (), back_inserter(v2) );

vector <char> v3;
istreambuf_iterator <char> iter_f3( file3 );
copy( iter_f3, istreambuf_iterator <char> (), back_inserter(v3) );

vector <char> ::iterator itor;
for( itor=v1.begin(); itor!=v1.end(); ++itor )
cout < < ' ' < < setw(2) < < setfill( '0 ') < < uppercase < < hex < < (unsigned)*itor;
cout < < "\n------\n ";
for( itor=v2.begin(); itor!=v2.end(); ++itor )
cout < < ' ' < < setw(2) < < setfill( '0 ') < < uppercase < < hex < < (unsigned)*itor;
cout < < "\n------\n ";
for( itor=v3.begin(); itor!=v3.end(); ++itor )
cout < < ' ' < < setw(2) < < setfill( '0 ') < < uppercase < < hex < < (unsigned)*itor;
cout < < "\n------\n ";

return 0;
}
// 结果输出
/* 如果 test.txt 内容为 "abc\r\n123 ", 则输出结果为:
61 62 63 31 32 33 // 文本方式 使用 istream_iterator, 无控制字符
------
61 62 63 0A 31 32 33 // 文本方式 使用 istreambuf_iterator, 在windows上, \r\n 转化为 \n
------
61 62 63 0D 0A 31 32 33 // 二进制方式 使用 istreambuf_iterator, 文件实际内容
------
*/

读书人网 >C++

热点推荐