读取原始文件C ++

时间:2011-12-08 21:36:51

标签: c++ file-io fstream

使用fstream class读取时如何存储数据?一个例子将澄清我的问题:

    char * memBlock = NULL;
    fileSize = file.tellg();
    memBlock = **new** char[fileSize];
    file.seekg(0, ios::beg);
    file.read(memBlock, fileSize);
    file.close();

    if(memBlock)
    return memBlock;

上下文是我正在读取以十六进制记录的原始图像,以便

  • 表示像素的值是00或ff(黑色或白色,1或0)
  • 并按列和行排列。

在内存中读取文件时,memblock array中的值是以ff和00存储还是由ASCII或其他东西自动转换为1和0?

2 个答案:

答案 0 :(得分:0)

当数据存储为十六进制时

00FF00FF

并且您使用file.read阅读,如您的代码所示, 然后它被存储为,这意味着

memcmp(memblock, "00FF00FF", 8) == 0

将评估为真。

修改

您必须自己进行转换。一种方法是

int ConvertToColor(const char *colorBuffer, size_t size)
{
    int color = -1;
    if(size >= 2)
    {
        char colorCode[3] = { colorBuffer[0], colorBuffer[1], 0 };
        long longColor = strtol(colorCode, NULL, 16);
        if(longColor != LONG_MAX && longColor != LONG_MIN)            
            color = (int)longColor;

    } 
    return color;   
}

std::vector<int> ConvertToColors(const char *memBlock, size_t size)
{
    std::vector<int> colors;
    for(size_t i = 0; i < size; i += 2)
    {
        int color = ConvertToColor(memBlock + i, size - i);
        if(color < 0)
            throw std::exception("Unable to convert color.");
        colors.push_back(color ? 1 : 0);
    }
    return colors;
}

答案 1 :(得分:0)

要读取原始数据文件,首先必须以二进制模式打开文件,这不是fstream的默认模式。使用file.open(filename, std::ios::binary|std::ios::in)

这样,读入内存缓冲区的内容将与文件内容完全相同。

因此,如果文件中包含00ff00ff,您的内存中将有00ff00ff。没有转换。

如果您要将其转换为01,假设00ff00ff,则表示每个字节为0x00, 0xff, 0x00, 0xff,您可以执行以下操作转换:(如果00ff00ff实际上是8个ASCII字符,请参阅esskar的回答)

for (size_t i=0; i<fileSize; i++)
{
    if (memBlock[i]!=0) memBlock[i]=1;
    // or
    // memBlock[i] &= 1;
}

这会将缓冲区转换为二进制01字节的序列。