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

时间:2014-05-05 11:39:15

标签: c++ fstream ifstream ofstream

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

4 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:4)

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

输入使用read,输出使用write

答案 2 :(得分:2)

您的代码中存在3个问题:

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

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

3-你应该使用&#34;操纵者&#34;并使c ++不要避免空格,所以为了从文件中读取而不是:

mySource >> buffer;

你应该使用:

mySource >> std:noskipws >> buffer;

答案 3 :(得分:0)

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

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