Подведение итогов ответов и добавление моих собственных наблюдений:
Вы должны проверить возвращаемое значение из open()
и read()
. Если они потерпят неудачу, вы будете слепо продолжать и печатать мусор.
read()
возвращает количество прочитанных символов или -1 в случае ошибки. Он НЕ заканчивает нулем свой буфер, поэтому использование strlen()
для определения количества прочитанных данных неверно.
Вы не должны помещать вызов strlen()
в условие проверки цикла, поскольку вы будете переоценивать его каждую итерацию.
Приведение buf[i]
к int
в операторе printf
не требуется. Дополнительные аргументы для функций с переменными значениями, такие как printf
(то есть все аргументы, составляющие ...
), переносятся по умолчанию следующим образом:
char
с, short
с и их неподписанные аналоги повышаются до int
с
float
с повышены до double
с
Без приведения buf[i]
в любом случае неявно повысится до int
, поэтому добавление приведения, хотя и правильное, делает код более запутанным для любого, кто его читает.
Итак, ваш код должен выглядеть так:
int fd = open("test.txt",O_RDONLY);
if(fd < 0)
{
fprintf(stderr, "open failed: %s\n", strerror(errno));
return;
}
char buf[128];
// It's better to use sizeof(buf) here, so we don't have to change it in case we
// change the size of buf. -1 to leave space for the null terminator
int reader = read(fd,buf,sizeof(buf)-1);
if(reader < 0)
{
fprintf(stderr, "read failed: %s\n", strerror(errno));
close(fd);
return;
}
buf[reader] = 0; // add null terminator for safety
int i;
for (i=0; i < reader; i++)
{
printf("%i: I read: %c", i, buf[i]);
}