2011-12-08 90 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字節的連續。