int size = 921600;
unsigned char output[size];
int i = 0;
ifstream DataFile;
DataFile.open("abc.jpeg");
while(!DataFile.eof()){
DataFile >> output[i];
i++;
}
/* i try to rewrite the above array into a new image here */
FILE * image2;
image2 = fopen("def.jpeg", "w");
fwrite(output,1,921600, image2);
fclose(image2);
答案 0 :(得分:2)
显示的代码中存在多个问题。
while(!DataFile.eof()){
这是always a bug。有关详细说明,请参见链接的问题。
DataFile >> output[i];
根据定义,格式化的提取运算符>>
会跳过所有空白字符并忽略它们。您的jpg文件中肯定有字节0x09、0x20和其他几个字节,它会自动跳过而不会读取它们。
为了正确执行此操作,您需要use read() and gcount()来读取二进制文件。正确使用gcount()
还会使您的代码正确检测文件结束条件。
答案 1 :(得分:1)
请确保在打开文件时添加错误检查。找到文件大小,然后根据文件大小读取缓冲区。
您可能还会考虑使用std::vector<unsigned char>
来存储字符。
int main()
{
std::ifstream DataFile("abc.jpeg", std::ios::binary);
if(!DataFile.good())
return 0;
DataFile.seekg(0, std::ios::end);
size_t filesize = (int)DataFile.tellg();
DataFile.seekg(0);
unsigned char output[filesize];
//or std::vector
//or unsigned char *output = new unsigned char[filesize];
if(DataFile.read((char*)output, filesize))
{
std::ofstream fout("def.jpeg", std::ios::binary);
if(!fout.good())
return 0;
fout.write((char*)output, filesize);
}
return 0;
}