2011-04-07 27 views
0

我正在將二進制數據讀入結構中,該結構正常工作。下面是代碼:如何在結構中使用字符串而不是char數組來讀取二進制數據

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

using namespace std; 

struct TaqIdx { 
    char symbol[10]; 
    int tdate; 
    int begrec; 
    int endrec; 
}__attribute__((packed)); 

int main() 
{ 
    ifstream fin("T201010A.IDX", ios::in | ios::binary); 

    if(!fin) { 
    cout << "Cannot open file." << endl; 
    return 1; 
    } 

    int cnt = 0; 
    TaqIdx idx; 

    while(fin.read((char *) &idx,sizeof(idx))) { 
    if(!fin.good()) { 
     cout << "A file error occurred." << endl; 
     return 1; 
    } 

    idx.symbol[10] = '\0'; 
    cout << "(" << idx.symbol << ", " << idx.tdate << ", " 
     << idx.begrec << ", " << idx.endrec << ") " 
     << cnt++ << endl; 
    } 

    fin.close(); 

    return 0; 
} 

輸出的前幾行如下:

(A   , 20100864, 1, 35981) 0 
(AA  , 20100864, 35982, 89091) 1 
(AAPR  , 20100864, 89092, 89093) 2 
(AACC  , 20100864, 89094, 89293) 3 
(AADR  , 20100864, 89294, 89301) 4 
(AAI  , 20100864, 89302, 99242) 5 
(AAME  , 20100864, 99243, 99252) 6 
(AAN  , 20100864, 99253, 102275) 7 
(AANA  , 20100864, 102276, 102280) 8 
(AAON  , 20100864, 102281, 102592) 9 

我的問題是:是否有可能取代C風格字符陣列中與所述結構C++字符串?如果是這樣,你能提供一個我將如何做的例子。非常感謝!

+1

經過一番努力。如果你知道這個結構有精確的字節佈局,並且你知道它不會改變,你現在的方法似乎是最優的(至少與引入不必要的抽象相比)。 – 2011-04-07 23:40:35

+0

編程決策圖出現在腦海裏:「它工作嗎?=>不要用它***」:-) – pajton 2011-04-07 23:45:28

+0

@Tomalak和@pajton,非常好的一點。額外的努力可能不值得我花時間。謝謝。 – TJB 2011-04-07 23:48:51

回答

0

我不能「評論無處不在」,所以我很抱歉這是一種超出這些部分的標準協議。爲什麼不休息?

idx.symbol[10] = '\0';

symbol的長度爲10,將不具有有__attribute__((packed))把一個空字節到的tdate第一字節?

+0

其實你很對。我應該通過查看我的輸出來注意到這一點。第二列(日期)不正確。這得到了我爲什麼想要使用字符串而不是char數組。如何使用非空終止的char數組使用cout?謝謝你的收穫。 – TJB 2011-04-08 00:16:05

+1

@TJB:'std :: cout << std :: string(ref_to_array,size_of_array);':) – 2011-04-08 00:26:37

+0

@Tomalak:就是這樣。謝謝! – TJB 2011-04-08 05:54:40

1

代碼似乎被設計爲讀取以特定二進制格式序列化爲TaqIdx格式的數據。您當然可以修改閱讀器以不同的格式(包括std::string s)提供數據,但是您必須在加載後重寫閱讀器或進行轉換。或者,您可以對數據使用完全不同的格式,但可能與您擁有的文件不兼容。

相關問題