使用 ifsream 和字符串流复制二进制文件时出错

Error when copying a binary file with ifsream and stringstream

本文关键字:二进制文件 出错 复制 ifsream 字符串 使用      更新时间:2023-10-16

我试图从包含纯文本标题后跟二进制图像信息的图像文件中剥离标头。作为先兆,我想将文件信息复制到字符串流中进行编辑。执行此操作时,我遇到了一些问题,导致我尝试简单地读取文件并将其作为新文件再次写回以进行调试。当我这样做时,新文件最终比原始文件大约 1kb。在UltraEdit中进行二进制比较时,似乎在十六进制字符0A(我相信换行)出现的地方,我的程序似乎在它之前添加了0D(回车)。我想知道这种行为的原因是什么,如果可能的话如何避免它。代码片段如下:

....
std::string inputFilename = argv[1];
std::ifstream in( argv[1],ios::out | ios::binary);
if ( in )
{
std::stringstream fileStream;
fileStream<<in.rdbuf();
cout<<fileStream.str().length(); //debugging
in.close();
ofstream myfile;
myfile.open("selfoutput");
myfile<<fileStream.str();
myfile.close();
....

感谢您的任何帮助!-大卫

尝试ios:in

std::ifstream in( argv[1],ios::in | ios::binary)

或者,事实上

std::ifstream in( argv[1],ios::binary)

这是等效的:

首先,执行与默认构造函数相同的步骤,然后通过调用 rdbuf()->open(filename, mode | std::ios_base::in)流与文件关联。如果 open() 调用返回空指针,则设置 设置状态(故障位)

这是我(未经测试的)简单主义者的看法:

#include <fstream>
int main(int /*argc*/, const char *argv[])
{
    std::ifstream in(argv[1], std::ios::binary);
    if (in)
    {
        std::ofstream myfile("selfoutput", std::ios::binary);
        if (myfile)
            myfile << in.rdbuf();
    }
}

为了无端的代码高尔夫和糟糕的风格:

#include <fstream>
using namespace std;
int main(int /*argc*/, const char *argv[]) {
    ofstream("selfoutput", ios::binary) << ifstream(argv[1], ios::binary).rdbuf();
}