2013-07-12 70 views
0

我試圖通過PHP編輯文本文件的第一行。我已經打破了我的腳本,並通過1測試函數1.我刪除第1行工作正常。然而,我然後嘗試在開頭插入一行,並將文件擦除爲零,然後寫入它。PHP編輯文本文件的第一行

我的代碼:

<?php 

$filename = $_GET['jobname']; 
$sunits = $_GET['s']; 
$wunits = $_GET['w']; 
$funits = $_GET['f']; 
$vunits = $_GET['v']; 
$tunits = $_GET['t']; 
$data = "S: $sunits - W: $wunits - F: $funits - V: $vunits - T: $tunits"; 

$f = "$filename.txt"; 

// read into array 
$arr = file($f); 

// remove second line 
unset($arr[0]); 

// reindex array 
$arr = array_values($arr); 

// write back to file 
file_put_contents($f,implode($arr)); 

$handle = fopen("$filename.txt", 'r+') or die('Cannot open file: '.$filename); 
fwrite($handle, $data . "\n"); 
fclose($handle); 

?> 

有人能看到我在做什麼錯?

感謝

回答

4

我只會用file_get_contents() [file() in your case] + file_put_contents()
無需後使用fopen()(當你調用file_put_contents()實際上它被稱爲。

<?php 
$filename = $_GET['jobname']; 
$sunits = $_GET['s']; 
$wunits = $_GET['w']; 
$funits = $_GET['f']; 
$vunits = $_GET['v']; 
$tunits = $_GET['t']; 
$data = "S: $sunits - W: $wunits - F: $funits - V: $vunits - T: $tunits"; 

$f = "$filename.txt"; 

// read into array 
$arr = file($f); 

// edit first line 
$arr[0] = $data; 

// write back to file 
file_put_contents($f, implode($arr)); 
?> 

您可能需要使用implode(PHP_EOL,$arr)所以陣列中的每個元素是它自己的行

+1

看完你的解決方案後,我寫我自己的:) –

0

您的問題來自於你使用的file_put_contents,這無論是創建一個文件,如果不存在,或者擦拭乾淨文件然後寫的內容吧。在你的情況下,你需要在追加模式下使用fopen,使用fwrite來寫入數據,然後使用fclose來關閉文件。在確切的代碼中可能會有另外一兩步,但這是將數據追加到已經存在內容的文件的一般想法。

+0

我的代碼的第一部分工作正常。它刪除第一個線條非常好。我的問題始於我打開和插入該行。這是一切都被抹去的地步。爲了該腳本的目的,該文件已經存在並且包含數據。我正在刪除第一行並將其替換爲另一行。 –

+0

最簡單的方法就是讀取文件,將數據追加到讀取的文件中,然後重寫整個文件。不是最好的,但會根據文件類型,內容和大小而正常工作 –

+0

這幾乎是我所做的。他們只是小文本文件,所以不會出現問題。 –

1

您不能在文本文件的開頭添加一行,只是在最後。你必須做什麼是新的行添加到數組的開頭,然後整個陣列寫回:

// Read the file 

$fileContents = file('myfile.txt'); 

// Remove first line 

array_shift($fileContents); 

// Add the new line to the beginning 

array_unshift($fileContents, $data); 

// Write the file back 

$newContent = implode("\n", $fileContents); 

$fp = fopen('myfile.txt', "w+"); // w+ means create new or replace the old file-content 
fputs($fp, $newContent); 
fclose($fp); 
+0

我已經採取了你建議並簡化了它的一些建議。 –

+0

其實,Mash的解決方案在那裏更加優雅...... :) – Swissdude

0

我最後是不是unset $arry[0]我設置了$arr[0] = $data . "\n",然後放回到文件,它工作。任何人看到這樣做是這樣嗎?

+0

聽起來像一個很好的解決方案:-) – Mash