C ++从ifstream读取一块并写入ofstream

Ziq*_*Liu 2 c++ c++11

我想从一个字节中读取一大块字节,ifstream然后再写入另一个字节中ofstream

这是我的代码:

size_t chunk_size = ...;
std::ifstream ifs(in_file_name);
std::ofstream ofs(out_file_name);

char * buffer = new char[chunk_size];
ifs.read(buffer, chunk_size);
ofs << buffer;
delete[] buffer;
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

根据CPP文件,std::ostream::operator<<接受一个streambuffer *作为参数。我不确定是否可以将char数组视为缓冲区流。

(我可以编译并运行代码,但是我的程序中存在一些问题,我不确定这是否是由此引起的,仍在尝试找出答案...)

Sla*_*ica 5

这是正确的方法吗?

并非如此。如果您使用std::istream::read()它,则很可能应该将其与之配对使用 std::ostream::write(),最好std::vector<char>用于内存管理(或至少使用智能指针):

size_t chunk_size = ...;
std::ifstream ifs(in_file_name);
std::ofstream ofs(out_file_name);

{ // you can use block to limit lifetime of the vector
    std::vector<char> buffer( chunk_size );
    ifs.read( buffer.data(), buffer.size() );
    ofs.write( buffer.data(), buffer.size() ); 
} 
Run Code Online (Sandbox Code Playgroud)

您的代码std::ostream::operator<<过载的问题,因为const char *期望终止字符串为空,而不是固定大小的二进制数据

  • 强烈建议(a)测试“ read”调用以确保流仍然有效,以及(b)使用[`std :: istream :: gcount`](https://en.cppreference.com/w/cpp/ io / basic_istream / gcount)来确定之后实际上有多少缓冲区是有效的,并且在执行写操作之前都要进行这两项操作。 (3认同)