> 백엔드 개발 > C++ > 본문

파일 설명자 및 시스템 I/O를 처리하는 방법을 알아보려면 다음 줄 프로젝트를 확인하세요.

Patricia Arquette
풀어 주다: 2024-10-06 22:07:30
원래의
575명이 탐색했습니다.

在 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
第五次通话:(null)

unistd.h 库提供的 read 函数用于从文件描述符读取数据。它需要三个参数:文件描述符、存储读取数据的缓冲区以及要从文件中读取的字节数,read 函数返回从文件中读取的字节数。

在文件描述符表中,有一个属性叫做offset。偏移量跟踪文件中的当前位置。每次调用 read 函数时,它都会从当前偏移量开始读取数据,然后将偏移量前进所读取的字节数。这可确保后续读取从上次读取停止的位置继续。

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

在我们的示例中:

  • 第一次调用 read 会从文件的开头(偏移量 0)开始读取文件的前 3 个字节并将它们存储在缓冲区中。然后偏移量更新为 3。
  • 第二次调用 read 读取从更新的偏移量 (3) 开始的接下来的 3 个字节,然后将偏移量更新为 6。
    等等...

  • 第 5 次调用读取缓冲区将为空,并且 read 返回 0 表示文件结束。

이 프로세스는 파일에서 모든 데이터를 읽거나 오류가 발생할 때까지 계속됩니다. 버퍼는 문자열로 인쇄될 수 있도록 각 읽기 후에 null로 종료됩니다.

문제

char *get_next_line(int fd)는 파일의 파일 설명자를 매개변수로 사용하고 각 호출에 대해 한 줄을 반환합니다. 파일의 끝에 도달하면 NULL을 반환합니다.

매개변수

  • fd: 읽을 파일의 파일 설명자.
  • BUFFER_SIZE: 파일에서 청크를 읽는 데 사용되는 버퍼의 크기입니다. 프로그램에 누출이 없어야 합니다.

해결책 :

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

위 내용은 파일 설명자 및 시스템 I/O를 처리하는 방법을 알아보려면 다음 줄 프로젝트를 확인하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!