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

read and write a binary file in c++ with fstream

本文关键字:读写 二进制文件 c++ fstream 使用      更新时间:2023-10-16

我正在尝试编写简单的c++代码来读取和编写文件。问题是我的输出文件比原始文件小,我一直在寻找原因。我有一个6.6 kb的图像,我的输出图像大约是6.4 kb

#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;
}

为什么不直接:

#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();
}

两件事:您忘记以二进制模式打开输出,并且您不能使用二进制数据的输入/输出操作符>><<,除非您使用输出操作符来编写输入流basic_streambuf(您可以使用rdbuf)。

输入使用read,输出使用write

你的代码中有3个问题:

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

2-你的代码返回"1",正常情况下你应该返回"0",如果出现问题,则返回错误代码。

3-你应该使用"操纵符"并使c++不避免空白,所以为了从文件中读取而不是:

mySource >> buffer;

应该使用:

mySource >> std:noskipws >> buffer;

这只是因为图像末尾的填充。任何文件的Eof都不包括在文件末尾添加的填充字节。试试这个取img1.jpg,其末尾包含20个空格字符,此处不可见(uegfuyregwfyugwrerycgerfcg6ygerbucykgeugcrgfrgeyf)并运行程序(不要在文件中包含括号,这些用于显示数据内容)。您将看到img2.jpg包含(uegfuyregwfyugwrerycgerfcg6ygerbucykgeugcrgfrgeyf)

因此,使用stat可以获得的filesize逐个字节读取文件是更好的选择,然后运行for循环直到filesize。希望这能解决你上面提到的问题