【问题标题】:Error when copying a binary file with ifsream and stringstream使用 ifsream 和 stringstream 复制二进制文件时出错
【发布时间】:2013-10-01 12:17:21
【问题描述】:

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

....
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();
....

感谢您的帮助! -大卫

【问题讨论】:

    标签: c++ file-io stringstream carriage-return file-copying


    【解决方案1】:

    试试ios:in

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

    或者,事实上

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

    等价的:

    首先,执行与默认构造函数相同的步骤,然后通过调用 rdbuf()-&gt;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();
    }
    

    【讨论】:

    • 标志位于std::ifstream。但是,std::ofstream 的“open()”中缺少它。
    • 嗯。我手没那么远。我的意思是,他正在打开 ifstream 以进行输出...
    • 他正在为输入和输出打开std::ifstream。这没有特别的意义,但不是真正的问题。实际的问题是使用std::ios_base::binary 选项打开std::ofstream
    • 感谢 sehe 和 @Dietmar !结合这些修复似乎奏效了。
    • 另外,关于为输入和输出打开 ifstream 是一个错误,您是对的……蚕食代码的危险!再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多