2016-01-20 112 views
0

我有一個包含單個字符串的文件。 我打開文件並讀取值,使用fopen和fgets,我注意到在字符串的末尾添加了一個空格。爲什麼fgets在字符串的末尾添加一個空格?

$file = fopen("myfile", "r") or exit("<br><p>Unable to open file</p><br>"); 
$mystring= fgets($file); 
fclose($file); 

內容MYFILE的:

Hello 

測試

echo "<p>'".$mystring."'</p>"; //Output: 'Hello ' 

正如你可以看到現在有在字符串後面加上一個空格,即使沒有空間在文件。

我試着用Linux命令「貓」一樣的:

$mystring = shell_exec("cat myfile"); 
echo "<p>'".$mystring."'</p>"; //Output: 'Hello ' 

仍然在字符串後面加上一個空格。

我的目標是比較文件中的字符串和我的代碼中的值。

if ($mystring === "Hello") 
{ 
    echo "Equal"; 
} 
else 
{ 
    echo "not equal"; 
} 

我總是得到「不相等」。 我如何讀取和存儲實際的文件內容到我的變量中?

+0

您可以使用['trim()'](http://php.net/manual/en/function.trim.php)。實際的文件內容是否有換行符?該文件是用不是文本友好的編輯器創建的嗎?有空間可以在那裏有很多原因。 –

+0

不,因爲如果文件內容是'hello''('hello'最後有空格),那麼我最後會放鬆空間。我需要實際的內容。 該文件是用「nano」創建的,我也試過gedit。 – Black

回答

3

要調試的字符串,試試這個:

foreach(str_split($mystring) as $chr) { 
    printf("[%02x] %s <br />",ord($chr),$chr); 
} 

這應該在你的情況下,產生類似...

[48]^h
[65]ë
[圖6c]升
[圖6c]升
[1207] O
[0A]

記下最後一個。 0x0a是一個換行符,它是通過fgetsshell_exec獲得的所有文本行的結尾,因爲這標誌着行的末尾(這兩個函數都會從其各自的活動返回一行「輸出」)。

(注意:您可能會[0c] [0a],或CRLF,取決於你的系統)

要解決,只是處理它之前的字符串中使用rtrim()

編輯:既然你的評價是的'hello '的情況下,應該允許添加,那麼你可以使用一些更明確的,像rtrim($mystring, "\r\n");

+0

謝謝你這個有用的答案!它現在按預期工作。 – Black

1

)有相當多的東西,可能是錯誤的。我會從檢查變量內容開始 - 如果可以的話調試,或者使用var_dump。

解決此問題的一個好方法是使用file_get_contents()代替(http://php.net/manual/de/function.file-get-contents.php)。我認爲這正是針對這種問題的;)

+0

謝謝你的回答。但不幸的是我仍然得到「不等於」 – Black

+1

好吧。所以問題不在於打開和閱讀文件內容。我認爲「Niet」從根本上存在問題,您的文件可能包含的不僅僅是「Hello」的5個字符。一條新線可能? – Salic

1

這可能是線結尾的差異,如MsDos,Unix或Mac。您可以使用函數auto_detect_line_endings。 (更多信息here)。

或者您可以在比較之前簡單地修剪輸出文件中的文本,如下所示。

$file = fopen("myfile", "r") or exit("<br><p>Unable to open file</p><br>"); 
$mystring= fgets($file); 
$mystring= trim($mystring); 
fclose($file); 
+0

謝謝你的回答。但是,如果文件內容將是「你好」(最後空格的Hello),那麼我會改變原來的值,但我不想改變它的值。我只想得到實際的值並將其存儲在一個變量中。 – Black

+0

所以如果你有一個沒有尾隨空間的問候,那麼fgets應該得到一個EOF或下一行字符。它會使用我在我的答案中提到的auto_detect_line_endings函數/指令來計算出來。 然後,也許你不必使用修剪和改變原來的文字。 –

相關問題