2014-06-14 61 views
7

編寫一個程序,該程序打開一個現有文件,用O_APPEND標誌寫入,然後 在寫入一些數據之前尋找文件的開頭。 數據在文件中出現在哪裏?爲什麼?O_APPEND標誌和lseek

這是我的代碼:

main() { 
    int fd = open("test.txt", O_WRONLY | O_APPEND); 

    lseek(fd, 0, SEEK_SET); 
    write(fd, "abc", 3); 
    close(fd); 
} 

,並已試了一下,發現數據已經寫在文件的結尾,我想知道爲什麼?因爲我指示的O_APPEND標誌沒有說太簡單了,我認爲

回答

11

當您打開與O_APPEND文件,所有的數據被寫入到最後,不管任何當前文件指針是從到lseek(2)最近通話或最新的讀取/寫入操作。從open(2) documentation

O_APPEND
該文件中追加模式打開。在每個write(2)之前,文件偏移位於文件末尾,就像使用lseek(2)一樣。

如果以後要寫入數據文件的末尾,然後它的開始,打開它,而不O_APPEND,使用fstat(2)來獲取文件大小(內struct statst_size成員),然後尋找到偏移量寫入結束。

+3

調用'lseek'不會被忽略。這個職位很榮幸能夠閱讀,即使你沒有閱讀,它仍然保留下來,並且可以回讀。但是,在每次寫入時,位置都會移回文件的末尾。 –

+2

您也可以通過使用'lseek(fd,0,SEEK_END)'(即不用獲取文件大小)來查找文件的末尾。 – NikitaBaksalyar

0

O_APPEND標誌強制文件指針僅指向文件的末尾。所以如果你從文件的開頭進行搜索,它將更新的文件指針位置作爲文件的開始,即舊文件的結束位置。