[英]problem in reading binary file (mix of ascii and binary)
我讀取二進制文件的代碼是:
dataFile.open(fileName.c_str());
ifstream binData("Trafficlog_Data.txt", ios::in | ios::binary); //binary data file
if(!binData) {
cout << "Cannot open file.\n";
return -1;
}
char *memblock;int nBytes =12;
memblock = new char [nBytes+1];
binData.read(memblock,nBytes);
memblock[nBytes+1]='\0';
std::string message;message.assign(memblock,nBytes);
printf("%s\n",message.c_str());
現在我已經給出了一個包含二進制和ascii數據的輸入文件
RFB 003.003
RFB 003.003
- 一些二進制數據 -
當我讀取前12個字節的文件“RFB 003.003 \\ n”但它打印“RFB 003.003 =”。 任何人都可以告訴我哪里錯了。 promblem不是'\\ 0'。 問題是它沒有讀“RFB 003.003 \\ n”。 是因為這個文件是二進制和ascii數據的混合
你沒有為memblock分配內存:
char *memblock = new char[nBytes+1];
更改:
memblock[nBytes+1]='\0';
至:
memblock[nBytes]='\0';
假設你用6個字節讀到了memblock
,它進入了0
到5
位置:
0 1 2 3 4 5 6 7
+---+---+---+---+---+----+---+---+
| H | E | L | L | O | \n | ? | ? |
+---+---+---+---+---+----+---+---+
( ?
區域仍然包含之前的垃圾)。
然后,您需要將null終止符放在位置6而不是位置7,就像您的代碼所做的那樣。
通過將空終止符放置到“右”的位置太遠,您首先要包含它?
位置,可以持有任何東西。
這就是造成你特定問題的原因。 您還遇到一個問題,即您沒有分配空間來容納您正在讀取的數據。您只需要一個char *
但實際上並沒有初始化它以指向可用內存。 這幾乎肯定會導致問題。
可能最簡單的解決方案是將其定義為:
char memblock[nBytes+1];
雖然我現在看到你已經在你的問題中解決了這個問題,但這並不重要。 上面介紹了實際問題(將空字節放在錯誤的位置)。
你是一個人:只做memblock[nBytes]='\\0';
索引從0開始,所以如果nBytes
為0,則在第一個位置寫入,如果nBytes
為1,則在第二個位置寫入,依此類推。 通過執行nBytes + 1
您實際上跳過一個位置並在字符串末尾留下一個垃圾字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.