2014-01-12 53 views
2

我想在已經有一些內容的文件的特定位置寫入文本。寫完後,我發現文件被截斷爲文本大小加上fseek位置,第一個字符的值爲0.這是正常行爲還是我錯過了什麼?我想提一下,我試圖避免將文件加載到內存中並將其寫回。PHP在文件中的特定位置覆蓋

$file = fopen("text.txt","w"); 
fseek($file,3); 
fwrite($file,"Hello"); 
fclose($file); 
+1

是你的問題,這是否是正常的行爲,或者如何覆蓋PHP中的文本文件中的數據?因爲你現在要問前者。 –

+0

如果我記得正確,我已經在C++中完成了這個工作,而沒有任何問題。我不能使用「a」,因爲fseek然後被忽略,並且追加模式意味着追加,而不是覆蓋。問題是爲什麼這不起作用?爲什麼這樣做?我已閱讀手冊,感謝您提出建議,但fseek的目的是什麼?只是爲了讀書? – root

+0

@ write2july閱讀我對這個問題的回答。我引用瞭解釋該行爲的手冊中的段落。 –

回答

4

您需要c模式來打開文件,否則它截斷fopen

$file = fopen("text.txt","c"); 

所有文件打開方式,他們怎麼做一個文檔,並請http://php.net/manual/de/function.fopen.php。另請參閱http://www.php.net/manual/en/function.fseek.php手動

+0

謝謝@ nigro.simone的+建議! –

+0

如果我記得正確,我已經在C++中完成了這個工作,而沒有任何問題。我不能使用「a」,因爲fseek然後被忽略,並且追加模式意味着追加,而不是覆蓋。問題是爲什麼這不起作用?爲什麼這樣做?我已閱讀手冊,感謝您提出建議,但fseek的目的是什麼?只是爲了讀書? – root

+0

我假設c模式是你正在尋找(編輯它)。據我所知,fseek經常用於寫作,我認爲你的問題主要是fopen(即在fseek甚至被調用之前)截斷了該文件,並且fseek在SEEK_SET位置之前添加了填充字符。 –

0

是的,這是正常的行爲:

fopen($file, "w")

地方文件指針指向文件的開頭和文件截斷爲零長度。

fseek()

一般情況下,它被允許尋求過去的文件結束-;如果接着寫入數據,則在中讀取文件結束和所尋找位置之間的任何未寫入區域將產生值爲0的字節。 [..] 如果以append(a或a +)模式打開文件,則無論文件位置如何,您寫入文件的任何數據都將被追加,並且調用fseek()的結果將不確定。

你可能想打開該文件以非截斷寫模式(例如「C」,但不是「a」)。