2013-01-11 187 views
2

我刚刚开始学习C++,并且正在开发一个程序,该程序应该从硬盘中获取图像,然后将其另存为另一个名称。原始图像仍应保留。我已经得到它与文本文件,因为我可以这样做:读取和写入图像数据C++

ifstream fin("C:\\test.txt"); 
ofstream fout("C:\\new.txt"); 

char ch; 
while(!fin.eof()) 
{ 
    fin.get(ch); 
    fout.put(ch); 
} 

fin.close(); 
fout.close(); 
} 

但我想这不是像这样的图像。我必须安装一个库或类似的东西才能使它工作?或者我可以“只”使用包含的库?我知道我并不是真正的C++专家,所以请告诉我我是否完全错误。

我希望有人能够并想帮助我!提前致谢!

顺便说一句,图像是一个.png格式。

+0

http://stackoverflow.com/q/4237405/1952879 – hmatar

+0

[(!fin.eof())''时是错误] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong)\ *打哈欠\ * –

+0

'但我想这不是像这样的图像.'为什么?所有文件都只是字节。 –

回答

6

您可以使用标准流,但在打开流时使用ios :: binary参数。这是有据可查的,并有几个互联网上的例子

+0

谢谢你,伙计! – GuiceU

2

你显然是使用MS Windows:Windows通过不同的处理行分隔符区分“文本”和“二进制”文件。对于二进制文件,您不希望它在读取时将\n\r转换为\n。为了防止它,打开文件时使用ios :: binary模式,如@Emil tells you

顺便说一句,你不必在windows下的路径中使用\\。只需使用正斜杠:

ifstream fin("C:/test.txt"); 

甚至在第二次世界大战中使用MS-DOS的情况下,这种工作方式还是有效的。

+0

+1第二次世界大战参考 –

+0

Yeaah!感谢关于只有/而不是\\的提示,它正在工作! :) – GuiceU

0

如果目标只是复制一个文件,那么CopyFile可能是比手动更好的选择。

#include <Windows.h> 
// ... 
BOOL const copySuccess = CopyFile("source.png", "dest.png", failIfExists); 
// TODO: handle errors. 

如果使用Windows API是不是一种选择,那么在像你已经做了一次复制一个文件一个char是这样做的非常低效的方式。正如其他人所指出的那样,您需要以二进制文件的形式打开文件,以避免I/O与行尾的混淆。比一次一个字符更简单,更有效的方法是这样的:

#include <fstream> 
// ... 
std::ifstream fin("source.png", std::ios::binary); 
std::ofstream fout("dest.png", std::ios::binary); 
// TODO: handle errors. 
fout << fin.rdbuf();