我在阅读有关Java& amp; C#,C ++是否也可以在不使用外部库的情况下读取image & pdf files
? C ++没有byte
类型,如Java& C#。那么我们如何完成任务(再次不使用外部库)?
任何人都可以进行小型演示(即用于阅读,复制或编写图像或pdf文件的程序或代码)吗?
答案 0 :(得分:2)
您可以使用unsigned char
或char
重新解释为某种整数类型来解析二进制文件格式,如pdf,jpeg等。您可以创建一个缓冲区std::vector<char>
并按如下方式读取:
std::vector<char> buffer((
std::istreambuf_iterator<char>(infile)), // Ensure infile was opened with binary attribute
(std::istreambuf_iterator<char>()));
答案 1 :(得分:2)
您在二进制模式下打开的文件没有区别,唯一的区别是您应该如何解释从文件中获取的数据。
准备好使用像libjpeg或其他什么。有很多。但是如果你真的想这样做,首先你应该定义合适的结构和常量(见下面的链接),以使代码更方便和可用。然后你只需阅读数据并尝试逐步解释它。下面的代码只是伪代码,我没有编译它。
#include <fstream>
// define header structure
struct jpeg_header
{
enum class marker: unsigned short { eoi = 0xffd8, sof0 = 0xffc0 ... };
...
};
bool is_eoi(unsigned short m) { return jpeg_header::eoi == m; }
jpeg_header read_jpeg_header(const std::string& fn)
{
std::ifstream inf(fn, std::ifstream::binary);
if (!inf)
{
throw std::runtime_error("Can't open file: " + fn);
}
inf.exceptions(std::ifstream::failbit | std::ifstream::eofbit);
unsigned short marker = inf.get() << 8;
marker |= inf.get();
if (!is_eoi(marker))
{
throw std::runtime_error("Invalid jpeg header");
}
...
jpeg_header header;
// read further and fill header structure
...
return header;
}
要使用ifstream::read()
,ifstream::readsome()
方法阅读大量数据。这是一个很好的例子http://en.cppreference.com/w/cpp/io/basic_istream/read。
这些函数也比流迭代器更快。它还可以更好地定义从std::runtime_error
派生的自己的异常类。
有关您感兴趣的文件格式的详细信息,请点击此处
答案 2 :(得分:1)
拥有像C这样的系统语言将是一个奇怪的世界,在这种情况下,C ++没有类型字节:)。 是的,我接受它,它有奇怪的名字,unsigned char,但它仍然存在:)。
真的只是考虑所有事情的重新开发的规模,以避免字节:)。外围设备,CPU和其他芯片中的许多寄存器,通信,数据协议。这一切都必须重做:)。