3

我刚刚开始学习 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 格式。

4

3 回答 3

7

您可以使用 std 流,但在打开流时使用 ios::binary 参数。它有据可查,互联网上有几个例子

于 2013-01-11T18:09:00.730 回答
2

您显然正在使用 MS Windows:Windows 通过对行分隔符的不同处理来区分“文本”和“二进制”文件。对于二进制文件,您不希望它在阅读时转换\n\r\n。为了防止这种情况,请在打开文件时使用 ios::binary 模式,正如@Emil 告诉你的那样。

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

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

这甚至可以在二战中使用 MS-DOS 进行。

于 2013-01-11T18:15:16.237 回答
0

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

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

如果使用 Windows API 不是一个选项,那么像您所做的那样一次复制一个字符的文件是非常低效的方法。正如其他人所指出的,您需要以二进制文件形式打开文件以避免 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();
于 2013-01-11T22:52:49.227 回答