【问题标题】:read and write a binary file in c++ with fstream使用 fstream 在 C++ 中读取和写入二进制文件
【发布时间】:2014-05-05 11:39:14
【问题描述】:

我正在尝试编写简单的 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;
}

【问题讨论】:

  • 我试图用它来获取它的二进制字符如:cout(buffer);

标签: c++ fstream ifstream ofstream


【解决方案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();
}

【讨论】:

  • 我试图用它来获取它的二进制字符如:cout(buffer);这样我就找不到它的二进制数据了
  • @user3604079:这就是为什么你应该问你的问题,而不是完全不相关的问题。请发布一个新的、不同的问题,并确保该问题的答案对您确实有帮助。
【解决方案2】:

两件事:你忘记以二进制模式打开输出,你不能使用输入/输出操作符&gt;&gt;&lt;&lt;来处理二进制数据,除非你使用输出操作符来写输入-流basic_streambuf(您可以使用rdbuf 获得)。

输入使用read,输出使用write

【讨论】:

    【解决方案3】:

    你的代码有3个问题:

    1- 您尚未打开二进制输出文件。

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

    3- 你应该使用“manipulators”并且让 c++ 不要避免空格,所以为了从文件中读取而不是:

    mySource >> buffer;
    

    你应该使用:

    mySource >> std:noskipws >> buffer;
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        相关资源
        最近更新 更多