Почему fgets добавляет пробел в конце строки?

У меня есть файл, который содержит одну строку.
Я открываю файл и читаю значение с помощью fopen и fgets, я заметил, что в конце строки добавляется пробел.

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

Содержание моего файла:

Hello

Тестовое задание

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

Как вы можете видеть, в конце строки теперь есть пробел, хотя в файле нет места.

Я попробовал то же самое с командой linux «cat»:

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

Еще пробел в конце строки.

Моя цель — сравнить строку в файле со значением в моем коде.

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

Я всегда получаю «не равны».
Как я могу прочитать и сохранить фактическое содержимое файла в моей переменной?

0

Решение

Чтобы отладить строку, попробуйте это:

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

Это должно, в вашем случае, дать что-то вроде …

[48] ​​H
[65] е
[6c] л
[6c] л
[6f] o
[0a]

Обратите внимание на этот последний. 0x0a является символом новой строки, который является то, что все строки текста, полученные через fgets а также shell_exec end with, так как именно это обозначает конец строки (обе функции возвращают «строку» вывода из их соответствующего действия).

(Примечание: вы можете получить [0c] [0a]или CRLF, в зависимости от вашей системы.)

Чтобы исправить, просто используйте rtrim() на строку перед обработкой.

РЕДАКТИРОВАТЬ: так как вы добавили в комментарии, что случай 'hello ' должно быть разрешено, тогда вы можете использовать что-то более явное, например, rtrim($mystring, "\r\n");

3

Другие решения

) Есть много вещей, которые могут быть не правы. Я бы начал с проверки содержимого переменных — отладки, если можете, или использования var_dump.

Хороший способ обойти проблему — использовать вместо нее file_get_contents () (http://php.net/manual/de/function.file-get-contents.php). Я думаю, что именно для такого рода проблем;)

1

Это может быть причиной различий в конце строк, таких как MsDos, Unix или Mac. Вы можете использовать функцию auto_detect_line_endings. (Больше информации Вот).

Или вы можете просто обрезать текст из выходного файла перед сравнением, как показано ниже.

$file = fopen("myfile", "r") or exit("<br><p>Unable to open file</p><br>");
$mystring= fgets($file);
$mystring= trim($mystring);
fclose($file);
1
По вопросам рекламы [email protected]