2013-10-12 328 views
1

我想將FILE *傳遞給另一個函數。在這個函數中,使用fread從文件中讀取一些字節。沒有寫作被執行。C++將FILE *作爲參數傳遞給函數

我不知道該不該說

void DoSomething(FILE *uFile) 

void DoSomething(const FILE *uFile) 

我害怕的地方引入內存泄漏,並認爲可能常量更安全。 我擔心該功能可能會創建一個文件的副本,或者當我不正確地傳遞它時。

創建FILE *就像這樣:

FILE *outfile = fopen("c:\\myfile.dat", "wb"); 

謝謝。

+0

是否真的需要傳遞文件指針? – Arpit

回答

4

無論您將FILE*傳遞給哪個函數,最終都會調用某些變體fread/fscanf/fwhatever。如果你看,所有這些函數都採用(非const)FILE*

你需要準備好給這些功能他們需要什麼。如果它們的原型採用非const參數,並且您嘗試給它們一個const參數,那麼您將收到編譯器警告。

出於這個原因,我想傳遞一個非const當你通過一個指針到對象作爲參數FILE*

+2

你會得到一個錯誤,而不是一個警告。 –

+0

我想你實際上應該在C中拋出const限定符,並在C++中出錯。 –

+0

謝謝,我剛剛注意到這一點。 – tmighty

0

你可以去:

void DoSomething(const FILE *uFile)

文件的任何副本創建。

+0

如果我不添加「const」會怎麼樣? – tmighty

+0

購買添加const,確保函數DoSomething()不會更改FILE結構的任何成員。它不保證文件內容不能被更改。 – Dinesh

+0

如果您傳遞沒有const DoSomething()可以更改傳遞的FILE結構的任何成員。 – Dinesh

1

C++絕不會複製對象。康斯坦丁並不是在那裏做關於複製的陳述,而是在那裏做出有關修改的陳述。所以你不必擔心泄漏。正如其他人已經指出的那樣,所有采用FILE*的函數都將其視爲非常量,因此無論如何您只需將其丟棄即可。

相關問題