我试图编写简单的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;
}
答案 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
获得)。
答案 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。希望这可以解决您上面提到的问题