如何将二进制文件内容读取为字符串?

时间:2012-06-14 00:42:55

标签: c++ filestream binaryfiles

我需要从二进制文件中读取16位std::stringchar *。例如,二进制文件包含89 ab cd ef,我希望能够将它们提取为std::stringchar *。我尝试了以下代码:

ifstream *p = new ifstream();
char *buffer;  
p->seekg(address, ios::beg);  
buffer = new char[16];  
memset(buffer, 0, 16);  
p->read(buffer, 16);  

当我尝试std::cout缓冲区时,没有任何内容出现。如何在二进制文件中读取这些字符?

编辑:我一直在寻找缓冲区为int类型,如“0x89abcdef”。有可能实现吗?

3 个答案:

答案 0 :(得分:4)

类似的东西:

#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>

int main()
{
    if (ifstream input("filename"))
    {
        std::string s(2 /*bytes*/, '\0' /*initial content - irrelevant*/);
        if (input.read(&s[0], 2 /*bytes*/))
            std::cout << "SUCCESS: [0] " << std::hex << (int)s[0] << " [1] " << (int)s[1] << '\n';
        else
            std::cerr << "Couldn't read from file\n";
    }
    else
        std::cerr << "Couldn't open file\n";
}

答案 1 :(得分:0)

您无法读取二进制流,就像它是文本一样。

当然可以读取为二进制文件(通过在流对象上使用“file.read()”和“file.write()”方法)。就像你现在正在做的那样:)

您还可以将二进制文件转换为文本:“转换为十六进制文本字符串”和“uuencode base 64”是执行此操作的两种常用方法。

答案 2 :(得分:0)

您希望将字节读取为数字(可能是long long类型)。 然后,您可以使用格式说明符like this打印它们:

#include <iostream>
#include <iomanip>

int main()
{
    using namespace std;

    int x =   2;
    int y = 255;

    cout << showbase // show the 0x prefix
         << internal // fill between the prefix and the number
         << setfill('0'); // fill with 0s

    cout << hex << setw(4) << x << dec << " = " << setw(3) << x << endl;
    cout << hex << setw(4) << y << dec << " = " << setw(3) << y << endl;

    return 0;
}