2016-10-09 27 views
3

我用下面的代码来读取二进制文件(在我的情况下是.docx文件),并将它存储在unsigned char数组中而不是char(参考文献Reading and writing binary file将文件存储在无符号字符数组中并打印出来

#include <fstream> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    std::ifstream input("C:\\test.docx", std::ios::binary); 
    std::vector<unsigned char> buffer((std::istreambuf_iterator<unsigned char>(input)), 
             (std::istreambuf_iterator<unsigned char>())); 
} 

现在我有两个问题。

我想知道的第一件事是,这是一个读取无符号字符数组中的.docx文件的正确方法吗?还是有更好的选择?

其次,我需要打印在unsigned char数组中读取的文件内容,以验证它是否正确读取了文件。这怎么能实现?

+0

为什么unsigned char? –

+0

打印.docx文件不会给你任何可读的东西。 –

+0

@BoPersson:当然可以。 ......哦,你的意思是*它不会显示文件内的文字* - 好吧,不,不会,但是OP没有明确说明他预期的结果。 – usr2564301

回答

1

这是一个好方法,如果你没有整个文件在内存中。如果你想阅读文件的部分,你应该重复它。它的一个用例就是通过网络传输它 - 在那里,你不需要整个文件在内存中。

关于打印的文件,它可以打印字节读取,例如,像这样:

#include <fstream> 
#include <iterator> 
#include <vector> 
#include <iostream> 
#include <iomanip> 

int main() 
{ 
    std::ifstream input("C:\\test.docx", std::ios::binary); 
    std::vector<unsigned char> buffer((std::istreambuf_iterator<unsigned char>(input)), 
             (std::istreambuf_iterator<unsigned char>())); 

    std::cout << std::hex; 
    for (unsigned char b : buffer) 
     std::cout << "0x" << std::setfill('0') << std::setw(2) << (int)b << " "; 
    std::cout << std::dec << std::endl; 
} 

如果你的意思是打印文件的内容,看到一些熟悉的文字,这是行不通的直。 docx文件使用Open XML File Format,这首先使它们成为一个zip文件。在zip文件内部,您可以找到文档中数据的XML表示,这些数据是可读的。

+0

那么如何确保文件已被读取并存储在unsigned char数组中? – DD25

+1

您可以使用我在答案中编写的方法,另外还可以使用十六进制编辑器(例如“010 editor”for windows或“hd”for linux)来查看某些部分是否匹配。您也可以用另一个名称将文件写回磁盘,并在这些文件之间做一个差异。 – kobigurk

+0

@ DD25:用一个好的十六进制编辑器打开原稿并与输出屏幕进行比较。你为什么会怀疑这个直截了当的代码不能正确读取文件? – usr2564301

相关问题