Программа тестирования файловых операций Linux не работает должным образом - PullRequest
0 голосов
/ 01 ноября 2018

Может ли кто-нибудь объяснить мне, почему печатается следующая тестовая программа:

ABCDE

fghie

jklie

м

1011 * ложь *

м

Ложь

Вместо:

ABCDE

fghie

jklie

mklie

mklie

Программа:

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
char buffer[16];
void main()
{
    int fd=open("bb",O_RDONLY);
    int i;
    for(i=5;i>0;i--)
    {
        read(fd,buffer,i);
        printf("%s\n",buffer);
    }
}

Файл bb содержит последовательность: abcdefghijklm

1 Ответ

0 голосов
/ 01 ноября 2018
  1. Первая итерация читает «abcde», поэтому buffer содержит «abcde \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0» и fd указывает на «f»
  2. Вторая итерация читает "fghi", поэтому buffer содержит "fghie \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0" и fd указывает на 'j'
  3. Третья итерация читает «jkl», поэтому buffer содержит «jklie \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0» и fd указывает на «m»
  4. Четвертая итерация читает «m \ n», поэтому buffer содержит «m \ nlie \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0», а fd - это в конце файла
  5. Пятая итерация ничего не читает, поэтому ничего не меняется в buffer

Обратите внимание, что код опирается на глобальную переменную buffer, инициализируемую нулем.

...