使用fstream在C++中读写二进制文件

4

我正在尝试编写简单的C++代码来读写文件。

问题在于我的输出文件比原始文件要小,而我卡在了找出原因上。

我的图片大小为6.6KB,但我的输出图片大约只有6.4KB。

#include <iostream>
#include <fstream>

using namespace std;

ofstream myOutpue;
ifstream mySource;

int main()
{        

    mySource.open("im1.jpg", ios_base::binary);
    myOutpue.open("im2.jpg", ios_base::out);

    char buffer;

    if (mySource.is_open())
    {
        while (!mySource.eof())
        {
            mySource >> buffer;            
            myOutpue << buffer;
        }
    }

    mySource.close();
    myOutpue.close();    

    return 1;
}

我试图使用它来获取其二进制字符,例如:cout<<static_cast<int>(buffer); - Hadi Rasekh
4个回答

5
为什么不直接这样做:
#include <fstream>

int main()
{
    std::ifstream mySource("im1.jpg", std::ios::binary);
    std::ofstream myOutpue("im2.jpg", std::ios::binary);
    myOutpue << mySource.rdbuf();
}

或者更简洁地说:
int main()
{
    std::ofstream("im2.jpg", std::ios::binary)
        << std::ifstream("im1.jpg", std::ios::binary).rdbuf();
}

我试图使用它来获取其二进制字符,例如:cout<<static_cast<int>(buffer); 这样我无法找到其二进制数据。 - Hadi Rasekh
@user3604079:这就是为什么你应该问你所拥有的问题,而不是完全无关的问题。请发布一个新的、不同的问题,并确保对它的回答实际上对你有帮助。 - Kerrek SB

4
两个问题:您忘记以二进制模式打开输出,而且您不能使用输入/输出运算符>><<来处理二进制数据,除非您使用输出运算符来写入输入流basic_streambuf(您可以使用rdbuf获取该流)。
对于输入,请使用read,对于输出,请使用write

2

你的代码存在3个问题:

1- 你没有以二进制方式打开输出文件。

2- 你的代码返回了“1”,通常应该返回“0”,如果出现错误,则返回错误代码。

3- 你应该使用“操纵符”,使c++不会避免空格,这样才能从文件中读取,而不是像这样:

mySource >> buffer;

您应该使用:

mySource >> std:noskipws >> buffer;

0

这是因为图像末尾有填充。文件的结尾并不包括添加在文件末尾的填充字节。 试试这个方法,取一个包含20个空格字符的img1.jpg(这里看不到:uegfuyregwfyugwrerycgerfcg6ygerbucykgeugcrgfrgeyf),然后运行你的程序(不要在文件中包含括号,这些只是用来显示数据内容的)。 你会发现img2.jpg包含(uegfuyregwfyugwrerycgerfcg6ygerbucykgeugcrgfrgeyf)。

所以,更好的选择是使用stat获取文件大小,逐字节读取文件,并运行循环直到文件大小。希望这能解决你上面提到的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接