Как читать помните последнее смещение файла? - PullRequest
0 голосов
/ 15 октября 2019

Как функция чтения знает следующую позицию для чтения из файла. или Как мне сделать функцию, которая может запомнить последнее смещение файла даже после открытия другого файла, изменив его дескриптор файла. Есть ли способ узнать, что файловый дескриптор уже открыт и указывает на файл?

как это:

int main()
{
  int fd;
  char *file;

  file = (char *)malloc(sizeof(char) * 32);
  fd = open("file.txt", O_RDONLY);
  read_file(fd, *file); /* reading the first line from file.txt */

  fd = open("file1.txt", O_RDONLY);
  read_file(fd, *file); /* reading the first line from file1.txt */

  fd = open("file.txt", O_RDONLY);
  read_file(fd, *file); /* Now it should read the second line from file file.txt, how can I manage to do that*/

  close(fd);
  return (0);
}

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

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

Если вам нужно открыть и прочитать два файлав то же время они, конечно, не должны совместно использовать дескриптор файла. Просто используйте два, по одному на файл.

const int fd1 = open("file.txt", O_RDONLY);
const int fd2 = open("file1.txt", O_RDONLY);

Обработка char *file в вашем коде не имеет смысла, но на этом этапе вы можете смешивать обращения к fd1 и fd2.

Не забудьте закрыть файлы, когда вы закончите:

close(fd2);
close(fd1);

В реальном коде вы также проверите, что открытые вызовы выполнены успешно, прежде чем пытаться выполнить ввод / вывод из файла (ов)конечно.

0 голосов
/ 15 октября 2019

Есть ли способ узнать, что дескриптор файла уже открыт и указывает на файл?

Если вы можете lseek(fd, 0, SEEK_CUR) успешно, это означает, что fd открыти доступный для поиска (так что, вероятно, файл, но помните, что «файл» включает в себя каталоги и файлы устройств, а также обычные файлы).

Если он возвращает (off_t)-1 и errno==EBADF, то дескриптор не открыт;если возвращает (off_t)-1 и errno==ESPIPE, то это труба, сокет или FIFO.

...