Maison >développement back-end >C++ >OBTENIR LA LIGNE SUIVANTE Un projet pour apprendre à gérer les descripteurs de fichiers et les E/S du système

OBTENIR LA LIGNE SUIVANTE Un projet pour apprendre à gérer les descripteurs de fichiers et les E/S du système

Patricia Arquette
Patricia Arquetteoriginal
2024-10-06 22:07:30640parcourir

C 프로그래밍 영역에서는 입력, 출력, 메모리를 효율적으로 관리하는 것이 기본입니다. 이러한 중요한 개념을 이해하는 데 도움이 되도록 get_next_line은 파일 설명자를 사용하여 파일을 한 줄씩 읽는 함수를 작성하는 프로젝트입니다. 함수를 호출할 때마다 파일의 다음 줄을 읽어 전체 파일 내용을 한 번에 한 줄씩 처리할 수 있습니다.

시스템의 파일 설명자 및 I/O 이해

파일 설명자란 무엇입니까?

파일 설명자는 시스템에서 열린 파일을 고유하게 식별하는 음수가 아닌 정수입니다. 프로그램이 파일을 열면 운영 체제는 파일 읽기, 쓰기 또는 닫기와 같은 후속 작업에서 해당 파일을 참조하는 데 사용할 수 있는 파일 설명자를 반환합니다. 파일 설명자는 파일, 소켓, 파이프를 비롯한 다양한 I/O 리소스를 관리하기 위해 운영 체제에서 사용하는 추상화입니다.

프로세스 A의 0, 1, 2(표준 입력, 표준 출력 및 표준 오류)는 독립적이며 프로세스 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 이상이므로 이러한 표준 스트림과 충돌하지 않습니다.

파일을 여는 방법


<p>'#include <fcntl.h>'<br>
'#include <unistd.h>'</p>

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




코드 분석

정수로 표시되는 파일 설명자는 파일 이름(또는 경로)과 파일의 액세스 권한을 결정하는 플래그라는 두 가지 매개변수를 사용하는 open 함수를 사용하여 얻습니다. 예를 들어, 파일 내용을 읽으려면 O_RDONLY 플래그(읽기 전용)를 사용합니다. 읽고 쓰려면 O_RDWR 플래그를 사용합니다. 사용할 수 있는 플래그가 많지만 이 프로젝트에서는 O_RDONLY만 사용하겠습니다. open 함수는 음이 아닌 정수를 반환하는데, 이는 작업이 성공할 경우 파일 설명자입니다. 그렇지 않으면 -1을 반환하여 오류를 나타냅니다(example.txt에 액세스할 수 있는 권한이 없습니다). open 함수는 unistd.h 라이브러리에 있고 권한 플래그는 fcntl.h에 정의되어 있습니다.

파일 설명자에서 읽기


<p>'#include <fcntl.h>'<br>
'#include <unistd.h>'<br>
'#include <stdio.h>'<br>
'#define BUFFER_SIZE 4'</p>

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




고장

코드 결과

첫 번째 통화 : HEL
두 번째 통화 : LO
세 번째 통화 : WOR
네번째 통화 : LD
5번째 호출 : (null)

unistd.h 라이브러리에서 제공하는 읽기 기능은 파일 설명자에서 데이터를 읽는 데 사용됩니다. 세 가지 매개변수, 즉 파일 설명자, 읽은 데이터를 저장할 버퍼, 파일에서 읽을 바이트 수를 사용하며, read 함수는 파일에서 읽은 바이트 수를 반환합니다.

파일 설명자 테이블에는 오프셋이라는 속성이 있습니다. 오프셋은 파일 내의 현재 위치를 추적합니다. 읽기 함수가 호출될 때마다 현재 오프셋부터 시작하여 데이터를 읽은 다음 읽은 바이트 수만큼 오프셋을 전진시킵니다. 이렇게 하면 마지막 읽기가 중단된 지점부터 후속 읽기가 계속됩니다.

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

예시:

  • 첫 번째 읽기 호출은 파일에서 처음 3바이트를 읽고 파일 시작 부분(오프셋 0)부터 버퍼에 저장합니다. 그러면 오프셋이 3으로 업데이트됩니다.
  • 두 번째 읽기 호출은 업데이트된 오프셋(3)에서 시작하여 다음 3바이트를 읽은 다음 오프셋을 6으로 업데이트합니다.
    등등...

  • 읽기 버퍼에 대한 다섯 번째 호출은 null이 되고 읽기는 파일 끝을 나타내는 0을 반환합니다.

Ce processus se poursuit jusqu'à ce que toutes les données aient été lues à partir du fichier ou qu'une erreur se produise. Le tampon se termine par un zéro après chaque lecture pour garantir qu'il peut être imprimé sous forme de chaîne.

LE PROBLEME

char *get_next_line(int fd) prend en paramètre un descripteur de fichier d'un fichier et renvoie une ligne pour chaque appel. S'il atteint la fin du fichier, il renvoie NULL.

Paramètres

  • fd : Descripteur de fichier du fichier à lire.
  • BUFFER_SIZE : La taille du tampon utilisé pour lire des morceaux du fichier. votre programme ne devrait avoir aucune fuite.

Solution :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn