2015-06-10 3 views
-1

Нужно ли это? Я всегда был нечетким на такого рода вещи, но если у меня есть что-то вроде:C - does read() добавить ' 0'?

char buf[256]; 
read(fd, buf, 256); 

write(fd2, buf, 256); 

Есть ли потенциал для ошибки здесь, кроме тех случаев, когда эти функции возвращают -1?

Если бы это было только для чтения 40 символов, было бы ли оно положить \ 0 после него? (И написал бы признать, что \ 0 и остановить? Кроме того, если бы это было читать 256 символов, есть \ 0 после того, как те 256?

+0

№ 'read (2)' не добавляет нулевой ограничитель, даже если он может читать только количество запрошенных байтов. –

+2

Если у вас есть такие сомнения, самый быстрый и надежный способ понять ответ - просто прочитать документацию. Есть онлайн-источники, есть справочные страницы и т. Д. –

+0

Насколько я могу судить, стандарт не комментирует содержимое buf, кроме данных, которые действительно читаются. Может быть, нам нужен [адвокат языка]. Было бы очень необычно, если бы что-то там было. – Random832

ответ

6

делает чтение() добавить '\ 0'

нет, это не так просто читает

?..

От read()'s documentation:

Функция чтения() будет пытаться читать nbyte байт из файла, связанного с дескриптора файла, Филдс, в буфер, на который указывает BUF.


Есть ли потенциал для ошибки здесь, кроме тех случаев, когда эти функции возвращают -1?

read() может возвращать 0 с указателем, начиная с даты окончания.

Если чтение (также из дескриптора сокета) read() не обязательно считывает столько байтов, сколько было сказано. Таким образом, в этом контексте не просто проверяйте результат чтения с -1, но также сравнивайте его с количеством байтов, которые функция должна была читать.


Общее примечание:

функции делать то, что документально (по крайней мере, для собственных реализаций языка C). Оба ваших предположения (автономно устанавливают 0-завершение, обнаруживают последнее) не документируются.

+0

' read() 'также может возвращать значение от 0 до 256, даже если' fd' является чем-то отличным от дескриптора сокета. Проверка короткого чтения должна выполняться для любого 'read()'. –

7

No.

Рассмотрим чтения двоичных данных (например, фото из файла):., добавив дополнительные байты будут повреждать данные

1

От человека странице:

Synopsis 

#include <unistd.h> 
ssize_t read(int fd, void *buf, size_t count); 

Это void *, не char *, потому что read() читает байты, а не символы. Он считывает нулевые байты, а также любое другое значение, и поскольку блоки байтов (в отличие от строк) не завершаются, read() этого не делает.

0

Нужно ли это?

Если только данные, которые успешно считываются из файла, содержат '\0' ...

Есть ли вероятность ошибки здесь, кроме случаев, когда эти функции возвращают -1?

Да. read возвращает фактическое количество прочитанных байтов (или отрицательное значение для указания отказа). Если вы выберете write больше, чем это количество байтов в ваш другой файл, тогда вы пишете потенциальный мусор.

Смежные вопросы