C ++文件(exe)阅读本身

时间:2015-12-23 20:31:27

标签: c++ binary fstream

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

#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个字符,出于某种原因......就是这样。我不知道为什么它不读取整个文件。有什么帮助吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

文件中的某些值会导致流输入过早结束,例如a \ 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;
}

答案 2 :(得分:2)

C ++ operator >> (const char *)流函数仅适用于C风格的字符串。它不适合任意二进制数据。您需要确定输出的内容,并编写代码以输出所需格式的原始任意二进制数据。

你还需要继续阅读。并且您需要使用不会超出缓冲区的读取功能。