【问题标题】:C++ file (exe) reading itself读取自身的 C++ 文件 (exe)
【发布时间】:2015-12-23 20:31:27
【问题描述】:

我想读取我的二进制文件,但我遇到了一些麻烦。现在这是我得到的:

#include <iostream>
#include <fstream>

int main(int argc, char * argv[])
{
    char data[1000];
    std::fstream file(argv[0], std::ios::in | std::ios::binary);
    file >> data;

    std::cout << data;

    system("PAUSE");
    return 0;
}

出于某种原因,这只会打印前 3 个字符……就是这样。我不知道为什么它没有读取整个文件。有什么帮助吗?

【问题讨论】:

  • 除了其他人指出的,请注意,当使用带有char 数组的格式化输入时,您设置底层数组的大小!当您在没有设置file.width() 的情况下执行file &gt;&gt; data; 时,如果在数组大小用尽之前没有停止读取,则可能会出现缓冲区溢出!理想情况下,您应该避免直接对char 数组使用格式化输入,而是使用std::string。当然,您的实际问题的答案是第三个字节被解释为空格,而您将使用未格式化的输入。

标签: c++ binary fstream


【解决方案1】:

文件中的某些值导致流输入过早结束,例如一个\n

试试类似的东西

int main(int argc, char * argv[])
{
    char data[1000];
    std::ifstream file(argv[0], std::ios::in | std::ios::binary);
    int i = 0; 
    while (file.get(data[i])
    {
       i++;
       if (i == 1000) break;
    }

    for (int j = 0; j < i; j++)
        std::cout << std::hex << data[j];

    system("PAUSE");
    return 0;
}

编辑:在 OP 评论后更新

在 C++ 中,您应该避免使用 c 样式的数组。请改用向量。向量具有动态大小,可以在需要时增长。

int main(int argc, char * argv[])
{
    char c;
    vector<char> data;
    std::ifstream file(argv[0], std::ios::in | std::ios::binary);
    while (file.get(c)
    {
       data.push_back(c);
    }

    for (auto t : data)  // for each ...
    {
        std::cout << std::hex << t;
    }

    system("PAUSE");
    return 0;
}

【讨论】:

  • 感谢您的帮助。还有一件事,现在代码只读取前 1000 个字节,我怎样才能读取整个文件?我已经尝试了一些东西,但是由于 char 数组需要一个常量(硬编码)值,我真的不知道该怎么做。
【解决方案2】:

您需要读取未格式化的可执行文件,并将其作为二进制文件打开。使用好旧的fread; filebuf 表面上很有吸引力,但它仍然会调用您不想要的语言环境转换。

【讨论】:

  • fstream.read()filebuf 一样未格式化,但它们仍然进行区域设置和构面字符转换。事实上,最好坚持使用fopenfread
  • @benvoight 啊!很高兴知道。我只将它用于未格式化的文本。
【解决方案3】:

C++ operator &gt;&gt; (const char *) 流函数仅适用于 C 风格的字符串。它不适用于任意二进制数据。您需要确定您希望输出的样子,并编写代码以您想要的格式输出原始的任意二进制数据。

您还需要继续阅读。而且您需要使用不会超出缓冲区的读取函数。

【讨论】:

    猜你喜欢
    • 2017-08-17
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多