簡體   English   中英

讀取二進制文件的問題(ascii和二進制的混合)

[英]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 ,它進入了05位置:

  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM