首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ifsream和copying流复制二进制文件时出错

使用ifsream和copying流复制二进制文件时出错
EN

Stack Overflow用户
提问于 2013-09-25 18:48:05
回答 1查看 608关注 0票数 3

我试图从包含纯文本标题和二进制图像信息的图像文件中删除标题。作为此的先驱,我希望将文件信息复制到一个字符串中进行编辑。在执行此操作时,我遇到了一些问题,导致我尝试简单地读取文件,并将其作为一个新文件重新写入,以便进行调试。当我这样做时,新文件最终比原来的文件大约1kb。当在UltraEdit中进行二进制比较时,似乎在任何地方,HEX字符0A (我相信)出现在我的程序前面添加了0D(回车)。我想知道这种行为的原因是什么,如果可能的话如何避免。代码片段如下:

代码语言:javascript
复制
....
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();
....

谢谢你的帮助!-David

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-25 18:48:53

试试ios:in

代码语言:javascript
复制
std::ifstream in( argv[1],ios::in | ios::binary)

或者,事实上

代码语言:javascript
复制
std::ifstream in( argv[1],ios::binary)

这相当于:

首先,执行与默认构造函数相同的步骤,然后通过调用rdbuf()->open(filename, mode | std::ios_base::in).. 将流与文件进行组合。如果open()调用返回空指针,则设置setstate(failbit)

下面是我(未经测试的)简单化者的看法:

代码语言:javascript
复制
#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();
    }
}

为了得到免费的高尔夫和糟糕的风格:

代码语言:javascript
复制
#include <fstream>
using namespace std;

int main(int /*argc*/, const char *argv[]) {
    ofstream("selfoutput", ios::binary) << ifstream(argv[1], ios::binary).rdbuf();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19012830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档