2010-11-02 114 views
0

我的任務我正在構建一個堆,堆的數據來自一個文件。其中一個功能是獲取數據,但我無法理解的ifstream的read()函數和我已經相當因爲它這個討厭的錯誤是什麼,我有:C++堆和ifstream閱讀函數

template<class T, class P> 
void get_list(vector<T>& v, const char* file_loc, P func) { 
    T data; 
    ifstream inFile; 

    inFile.open("file_loc"); 
    if (!inFile) { 
     cerr << "Error - unable to open input file\n"; 
     exit(1); 
    } 

    inFile.read(&data, sizeof(T)); 

    while (inFile) { 
     inFile.read(&data, sizeof(T)); 
     insert(v,data,func); 
    } 

    inFile.close(); 
} 

錯誤我收到是:

prog7.h:53: error: no matching function for call to 
‘std::basic_ifstream<char, std::char_traits<char> >::read(int*, long unsigned int)’ 
/usr/include/c++/4.3/istream:468: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,_Traits>::read(_CharT*, std::streamsize) 
[with _CharT = char, _Traits = std::char_traits<char>] 

任何幫助將不勝感激!

回答

2

原型爲的std :: ifstream的::瞭解

istream& read (char* s, streamsize n); 

所以,你必須

inFile.read(&data, sizeof(T)); 

應該

inFile.read((char*) &data, sizeof(T)); 

然而ŧ他假定您正在讀取來自二進制文件的原始字節。如果您解析文本文件用十進制ASCII字符表示的整數你可以只使用

inFile >> data; 
+0

'inFile >> data'和'infile.read(...)'完成不同的事情。 – 2010-11-02 23:09:58

+0

@Marcelo Cantos:的確如此。我只是覺得他應該知道他想做的兩件事中的哪一件。 – Akusete 2010-11-02 23:17:41

+0

我只在你的答案中注意到了二進制與文本的解釋。如果我在寫評論時已經在那裏,我們表示歉意。 – 2010-11-02 23:23:39

4

istream::read需要char*。你需要演員:(char*)&data

此外,您的代碼中存在一個錯誤。即使流測試通過,讀取也可能失敗。這種慣用的解決方案是:

while (inFile.read(&data, sizeof(T))) { 
    insert(v,data,func); 
} 

總體而言,您的代碼可以變得更簡單;你可以在構造函數中打開該文件並讓析構函數關閉它。另外,我想知道在循環之外的第一次閱讀;你是否打算跳過文件中的第一個條目?

template<class T, class P> 
void get_list(vector<T>& v, const char* file_loc, P func) { 
    T data; 
    ifstream inFile("file_loc"); 
    if (!inFile) { 
     cerr << "Error - unable to open input file\n"; 
     exit(1); 
    } 

    inFile.read(&data, sizeof(T)); 

    while (inFile.read(&data, sizeof(T))) { 
     insert(v,data,func); 
    } 
} 
+0

如果您更喜歡將C++類型轉換('reinterpret_cast')轉換爲C類型轉換? – 2010-11-02 23:14:04

+0

@Diego:我的純粹主義者說是的,但是我的實用主義者從未看到讓這樣的代碼更加冗長的任何好處。在過去的15年中,我曾經有過一次我花了大約五分鐘的時間來尋找一個可疑的演員陣容,這個演員陣容會花上幾秒鐘的時間才能發現它是否被寫爲reinterpret_cast。所以,對我而言,不使用新式演員的一生花費大約是五分鐘。更正:現在已經翻倍至十分鐘,因爲我只花了大約五分鐘的時間思考和迴應您的評論。 – 2010-11-02 23:15:56

+0

哈哈,我明白了。無論如何,這不是時間浪費在這個或那個時間上的問題,而是可能使用的是案件的目的。 – 2010-11-02 23:23:05

0

您實例化int類型的模板,但讀不重載函數,它的指針int,因爲它是第一個參數。您可以使用reinterpret_cast顯式強制轉換爲char *。

0

read()預計char*(即基礎流的元素類型)。所以,你需要將數據指針轉換爲char*

inFile.read(reinterpret_cast<char*>(&data), sizeof(T)); 
0

你必須指針轉換爲char*這就是讀期待。您必須在read中使用reinterpret_cast<char*>(&data)。請注意,這是非常危險的,因爲此轉換根本沒有被檢查,您必須確定您正在閱讀的內容是否符合T類型。該代碼在架構,字號等方面不可移植。