«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > ПОЛУЧИТЕ СЛЕДУЮЩУЮ СТРОКУ Проект, ЧТОБЫ научиться работать с файловыми дескрипторами и вводом-выводом системы.

ПОЛУЧИТЕ СЛЕДУЮЩУЮ СТРОКУ Проект, ЧТОБЫ научиться работать с файловыми дескрипторами и вводом-выводом системы.

Опубликовано 7 ноября 2024 г.
Просматривать:327

В области программирования на C эффективное управление вводом, выводом и памятью имеет основополагающее значение. Чтобы помочь вам понять эти важные концепции, get_next_line — это проект, в котором вы напишете функцию, которая читает файл построчно, используя файловый дескриптор. При каждом вызове функции считывается следующая строка из файла, что позволяет обрабатывать все содержимое файла по одной строке за раз.

Понимание файловых дескрипторов и ввода-вывода в системе

Что такое файловый дескриптор?

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

0, 1 и 2 (стандартный ввод, стандартный вывод и стандартная ошибка) в процессе A независимы и отделены от файловых дескрипторов в процессе B. Такая изоляция гарантирует, что файловые операции в одном процессе не мешают операциям в другой.

таблица дескрипторов файлов

GET NEXT LINE A Project TO Learn How To Deal with File Descriptors and I/O of System

Каждый дескриптор файла связан с записью таблицы дескрипторов файлов, которая содержит важную информацию о файле. Сюда входят путь к файлу, права доступа и текущее смещение, которое отслеживает положение в файле для операций чтения/записи. Эта структура позволяет операционной системе эффективно управлять несколькими открытыми файлами и обеспечивать правильный доступ и манипулирование данными.

Обратите внимание, что файловые дескрипторы 0, 1 и 2 зарезервированы операционной системой для стандартных потоков. Дескриптор файла 0 используется для стандартного ввода (stdin), который обычно представляет ввод с клавиатуры. Дескриптор файла 1 используется для стандартного вывода (stdout), который представляет собой вывод на экран или терминал. Дескриптор файла 2 используется для стандартной ошибки (stderr), которая также представляет вывод на экран или терминал, но специально предназначен для сообщений об ошибках. Эти зарезервированные файловые дескрипторы обеспечивают согласованное управление основными операциями ввода и вывода в различных программах и средах. Любой файловый дескриптор, возвращаемый функцией open, будет иметь номер 3 или выше, что гарантирует, что он не конфликтует с этими стандартными потоками.

как открыть файл

пример

'#include '
'#include '

int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}




разбивка кода

Дескриптор файла, представленный в виде целого числа, получается с помощью функции open, которая принимает два параметра: имя файла (или путь) и флаги, определяющие права доступа к файлу. Например, чтобы прочитать содержимое файла, мы используем флаг O_RDONLY (только для чтения). Для чтения и записи мы используем флаг O_RDWR. Хотя доступно множество флагов, в этом проекте мы будем использовать только O_RDONLY. Функция open возвращает неотрицательное целое число, которое является дескриптором файла, если операция прошла успешно; в противном случае возвращается -1, указывая на ошибку (у вас нет разрешения на доступ к файлу example.txt). Обратите внимание, что функция открытия находится в библиотеке unistd.h, а флаги разрешений определены в fcntl.h.

чтение из файлового дескриптора

пример

'#include '
'#include '
'#include '
'#define BUFFER_SIZE 4'

int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}
char buffer[BUFFER_SIZE];
read(fd, buffer, sizeof(buffer)-1);
printf("1st call : %s\n", buffer);
// prints the first 3 bytes
read(fd, buffer, sizeof(buffer)-1);
printf("2nd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("3rd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("4th call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("5th call : %s\n", buffer);




авария

результат кода

1-й звонок: ХЕЛ
2-й звонок: ЛО
3-й звонок: WOR
4-й звонок: LD
5-й вызов: (ноль)

Функция чтения, предоставляемая библиотекой unistd.h, используется для чтения данных из файлового дескриптора. Он принимает три параметра: дескриптор файла, буфер для хранения прочитанных данных и количество байтов, которые нужно прочитать из файла. Функция чтения возвращает количество байтов, прочитанных из файла.

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

GET NEXT LINE A Project TO Learn How To Deal with File Descriptors and I/O of System

В нашем примере:

  • Первый вызов read считывает первые 3 байта из файла и сохраняет их в буфере, начиная с начала файла (смещение 0). Затем смещение обновляется до 3.
  • Второй вызов read считывает следующие 3 байта, начиная с обновленного смещения (3), затем обновляет смещение до 6.
    и т. д ...

  • 5-й вызов чтения буфера будет нулевым, а чтение вернет 0, указывающее конец файла.

Этот процесс продолжается до тех пор, пока все данные не будут прочитаны из файла или пока не произойдет ошибка. Буфер завершается нулем после каждого чтения, чтобы его можно было напечатать в виде строки.

ПРОБЛЕМА

char *get_next_line(int fd) принимает в качестве параметра файловый дескриптор файла и возвращает одну строку для каждого вызова. Если он достигает конца файла, он возвращает NULL.

Параметры

  • fd: файловый дескриптор файла для чтения.
  • BUFFER_SIZE: размер буфера, используемого для чтения фрагментов файла. в вашей программе не должно быть утечек.

Решение :

https://github.com/Its-JoeTheKing/get_next_line

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/aerrfig/get-next-line-a-42-project-to-learn-how-to-deal-with-file-descriptors-and-io-of-. system- 3652 Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3