使用fstream在c++中读写二进制文件
read and write a binary file in c++ with fstream
我正在尝试编写简单的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。希望这能解决你上面提到的问题
相关文章:
- C++中读/写二进制文件
- 谷歌测试读写同一文件失败
- 读/写二进制文件返回0xcccccccccccc
- 用于读/写的C++文件流
- C++:读/写二进制文件。此代码中发生了什么?
- 如何读/写INI文件Visual c++6.0(MFC)
- 用c++读写excel文件
- 在c++中读写二进制文件
- 读写DOCX文件
- 用c++写二进制文件
- 读/写同一个文件(获取gmon.out)
- 当数据比较复杂时,读写二进制数据到文件
- c++读写大文件
- 读写二进制文件- fortran和c++
- 写二进制文件的行为很奇怪
- 如何使用boost库读写.ini文件
- c++读写二进制模式
- 用c++读写二进制信息
- 使用fstream在c++中读写二进制文件
- 写二进制文件时空格过多