2014-01-05 122 views
-1

我知道指針是存儲另一個變量地址的變量。所以我理解了char類型指針,整數類型指針的概念,當我們將一個指針添加到指針等時會發生什麼。但是我沒有得到文件指針背後的真正概念。爲什麼我們不能像字符數據類型那樣直接指向它們?例如,考慮一個帶有內容的文件:文件指針或流指針背後的概念是什麼?

讓'ptr'指向這個文件。爲什麼我們不能使用技術ptr指向'H',(ptr + 1)爲'e',(ptr + 2)爲'l'等等。如果我的問題很愚蠢,請原諒我有時候會明白我是否理解了真正的概念。我認爲這個文件實際上存儲在內存中,就像字符串存儲在內存中一樣。 (我知道fscanf()函數和全部)

回答

2

有一些東西叫做memory mapped file,但是除此之外,你可以實現你想要的(如果我正確地理解它),只需打開文件並將其加載到緩衝區中(這是從文件中讀取數據的常用方式)。

一旦進入內存,您訪問的第一個字節爲*buf,第二個爲*(buf+1)依此類推;或者,因爲更清晰,通常會更好,buf[0],buf[1]等等。

爲什麼你不能使用內存映射文件?因爲當你用C語言打開一個文件(使用fopen)時你有什麼是一個不透明的指針(即指向未知的數據的指針,你必須將其視爲一個「概念」,而不是你可以讀取的實際數據),允許其他函數(fread,fwrite,fseek等)在打開的文件上「運行」,但該指針不「包含」文件的字節。它有時被稱爲處理程序出於某種原因:它使它有可能「處理」該文件。

使用該不透明指針FILE*,您可以從內存中讀取該文件中的字節,然後可以處理內存中的數據。

0

我想你是在C語言環境中談論。不,該文件實際上並未存儲在內存中。考慮文件指針,例如作爲一個指針/箭頭,它顯示了你在閱讀該文件的過程中有多遠。這意味着,如果您現在執行讀取操作,則指針會告訴您將從該文件讀取哪個char/int等,即您當前在哪裏讀取該文件。這是指針的用途。這是我粗略和非正式地解釋這一點的方式。

+0

但我期望文件被加載到內存中,因爲我知道它必須在執行前加載到內存 –

0

我想我不會指望ptr + 1給我這個文件的第二個字符的基本原因是,在C語言中,指針算術移動一個對象,而不是一個字節;所以我希望ptr + 1指向「下一個」文件,無論這意味着什麼(如果有的話)。

而文件通常存儲在磁盤上,而不是存儲在內存中。

0

該文件未存儲在內存中。當你打開它時,它可以被帶到內存中(或者它的一部分)。文件不是程序數據的一部分,它們只是一個可以在操作系統幫助下使用的實體。

與內存中的常規字符數組相比,文件後面有更多的內容。通常會緩衝讀取和寫入文件,這由標準C庫FILE結構進行處理,該結構允許您調用文件上的操作。

什麼意思,甚至有「指向文件」?你看,ptr+1掃描文件並不是一個很好的選擇,原因很多。如果它是二進制數據,那麼您對ptr+1有何期待?如果你想閱讀更大的數據塊,比如一次一行?

正如你所看到的,這個選擇有幾個原因,主要的原因是文件沒有像常規變量一樣放在程序地址空間的內存中。描述文件和光標位置的結構是最常用的方法。

另一個要注意的重點是ptr+1的語義只對語言內置類型有意義。文件不是內置類型,它是沒有意義的。