【问题标题】:Store file in unsigned char array and print it将文件存储在无符号字符数组中并打印
【发布时间】:2016-10-09 10:32:21
【问题描述】:

我已经使用下面的代码读取了一个二进制文件(在我的例子中是 .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>()));
}

现在我有两个问题。

首先我想知道,这是在 unsigned char 数组中读取 .docx 文件的正确方法吗?还是有更好的选择?

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

【问题讨论】:

  • 为什么是无符号字符?
  • 打印一个 .docx 文件不会给你任何可读的东西。
  • @BoPersson:肯定会的。 ...哦,您的意思一定是它不会显示该文档中的文本 - 不,它不会,但是 OP 没有明确说明他期望它。
  • 我需要确保文件已被读取并成功存储在无符号字符数组@RadLexus

标签: c++ arrays


【解决方案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 表示形式,它们是可读的。

【讨论】:

  • 那么如何确保文件已被成功读取并存储在 unsigned char 数组中?
  • 您可以使用我在答案中写的方法,另外使用十六进制编辑器,例如 Windows 的“010 编辑器”或 linux 的“hd”,以查看某些部分是否匹配。您还可以使用另一个名称将文件写回磁盘并在它们之间进行差异。
  • @DD25:用一个好的十六进制编辑器打开原始文件并与输出屏幕进行比较。为什么你会怀疑这个简单的代码没有正确读取文件?
  • @kobigurk:有趣的事情(与我上面所说的相反)是有时我的阅读代码有一个小错误;比如说,一个无符号与有符号的混淆,或者一个误入歧途的链表 - 开发被停止,直到我最终回到“让我们看看 实际上 存储在内存中的内容......”
  • @kobigurk 我将在原始文件和写回磁盘的文件之间进行比较。但是,关于您提到的部分,我可以分段读取文件并对其进行迭代。你能告诉我如何实现吗?
猜你喜欢
  • 2014-05-05
  • 1970-01-01
  • 2017-11-27
  • 2018-01-11
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多