2012-10-22 74 views
0

我讀取與fstream的二進制文件和存儲在字符數組的信息二進制文件:讀與fstream的

int dataLength = 32; 
int counter = 0; 
char data[dataLength]; 
char PMTone[dataLength/4]; 
std::fstream *fs = new std::fstream(inputFileName,std::ios::in|std::ios::binary); 
fs->read((char *)&data, dataLength); 
//of the 32 characters in data[], I need first, 5th etc elements: 
//fill first pmt info 
for(int i=0; i<(dataLength/4); i++){ 
PMTone[i]=data[counter]; 
counter+=4; 
} 

現在我設置PMTone [7]是一個作爲測試:

PMTone[7] = "a"; 

我得到的錯誤:

mdfTree.cpp:92:21: error: invalid conversion from ‘const char*’ to ‘char’ [-fpermissive]

我不明白,爲什麼在PMTone元素[]是指向字符,當PMT一個[]被定義爲一個字符數組。

當我把PMTone []作爲指針數組字符:

(*PMTone)[7] = "a"; 

我得到另一個錯誤,我不明白:

mdfTree.cpp:91:18: error: invalid types ‘char[int]’ for array subscript

這似乎暗示編譯器並不認爲PMTone []是一個數組,而只是一個指向char的指針。

任何人都可以闡明這裏發生的事情嗎?爲什麼PMTone []成爲指向字符的指針數組?

回答

2

字面"a"不是一個字符。

您需要:

PMTone[7] = 'a'; 
1

"a"不是一個字符是一個字符數組, 'a' 後跟一個空終止符。

您需要

PMTone[7] = 'a'; 

用單引號。順便提一句,我很驚訝它編譯更早,因爲dataLength沒有被聲明爲const。

PMTone本身的類型是char[8]這是一個字符數組。然而,它衰減到一個指針和(*PMTone)是類型char

0

的第一個元素,陣列是由具有在第一元件的地址,並通過索引訪問其它元素存儲值的方式。 數組基本上是指向第一個元素的指針。

當您創建chars

char arr[n]; 

程序的數組實際上創造的空間用於存儲n個字符。

當訪問arr[0]讓我們這樣說:

arr[2] = 'a'; 

程序實際上是這樣做的:

*(arr + 2) = 'a'; 

這意味着你正在訪問是從的存儲位置存儲2個字節進一步字符第一個元素(因此,arr + 2),第一個元素是arr[0]。 第一個元素的地址是&(arr[0])arr。兩者都是相同的值。

該錯誤是您嘗試將字符串"a"保存爲char的地方。

(*PMTone)[7] = "a"; // is the same as 
(PMTone[0])[7] = "a"; // when it should be 
PMTone[7] = 'a'; 

問題是你試圖通過解引用取消引用指針固定它