В области программирования на C эффективное управление вводом, выводом и памятью имеет основополагающее значение. Чтобы помочь вам понять эти важные концепции, get_next_line — это проект, в котором вы напишете функцию, которая читает файл построчно, используя файловый дескриптор. При каждом вызове функции считывается следующая строка из файла, что позволяет обрабатывать все содержимое файла по одной строке за раз.
Дескриптор файла — это неотрицательное целое число, которое однозначно идентифицирует открытый файл в системе. Когда программа открывает файл, операционная система возвращает дескриптор файла, который можно использовать для ссылки на этот файл в последующих операциях, таких как чтение, запись или закрытие файла. Дескрипторы файлов — это абстракция, используемая операционной системой для управления различными ресурсами ввода-вывода, включая файлы, сокеты и каналы.
0, 1 и 2 (стандартный ввод, стандартный вывод и стандартная ошибка) в процессе A независимы и отделены от файловых дескрипторов в процессе B. Такая изоляция гарантирует, что файловые операции в одном процессе не мешают операциям в другой.
Каждый дескриптор файла связан с записью таблицы дескрипторов файлов, которая содержит важную информацию о файле. Сюда входят путь к файлу, права доступа и текущее смещение, которое отслеживает положение в файле для операций чтения/записи. Эта структура позволяет операционной системе эффективно управлять несколькими открытыми файлами и обеспечивать правильный доступ и манипулирование данными.
Обратите внимание, что файловые дескрипторы 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, используется для чтения данных из файлового дескриптора. Он принимает три параметра: дескриптор файла, буфер для хранения прочитанных данных и количество байтов, которые нужно прочитать из файла. Функция чтения возвращает количество байтов, прочитанных из файла.
В таблице дескрипторов файлов есть атрибут, называемый смещением. Смещение отслеживает текущую позицию в файле. Каждый раз, когда вызывается функция чтения, она считывает данные, начиная с текущего смещения, а затем увеличивает смещение на количество прочитанных байтов. Это гарантирует, что последующие чтения продолжатся с того места, где остановилось последнее чтение.
В нашем примере:
Второй вызов read считывает следующие 3 байта, начиная с обновленного смещения (3), затем обновляет смещение до 6.
и т. д ...
5-й вызов чтения буфера будет нулевым, а чтение вернет 0, указывающее конец файла.
Этот процесс продолжается до тех пор, пока все данные не будут прочитаны из файла или пока не произойдет ошибка. Буфер завершается нулем после каждого чтения, чтобы его можно было напечатать в виде строки.
char *get_next_line(int fd) принимает в качестве параметра файловый дескриптор файла и возвращает одну строку для каждого вызова. Если он достигает конца файла, он возвращает NULL.
https://github.com/Its-JoeTheKing/get_next_line
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3