2011-12-08 63 views
0

使用fstream class读取数据时如何存储数据?下面举例说明我的问题:阅读原始文件C++

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?

+0

很多东西在这里没有意义。原始图像是二进制数据。二进制数据可以用十六进制查看,但不能转换为十六进制。这仅适用于文本数据。您的图像是否转换为文本文件? –

+0

thnx为编辑,srry关于尴尬的语言我的意思是说,如果ff被存储为11111111在内存中存在一种方法,我可以将它转换为char ='1'使用printf(一些说明符, param) – user1084113

回答

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; 
} 
+0

好的,所以如果我的程序期望采取1和0的数组我需要解析00和ff数据等于1和0(代替00或ff)是否有一个函数会自动执行该操作当我读取原始数据时,还是必须创建自己的数据? – user1084113

+1

@ user1084113:由于这是一个非常bizzare的翻译,你必须自己做一些事情。当你说你的程序需要一个1和0的数组时,你的意思是一个'1'和'0'字符的数组,字符是1还是0,还是原始二进制? –

+0

1s和0s的字符 – user1084113

0

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

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

因此,如果您在文件中有00ff00ff,您的内存中将有00ff00ff。将不会有转换。

如果你想将它转换为0的和1年代,随着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字节的连续。