」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 取得下一行學習如何處理檔案描述符和系統 I/O 的項目

取得下一行學習如何處理檔案描述符和系統 I/O 的項目

發佈於2024-11-07
瀏覽:401

在 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 或更高,确保它不会与这些标准流冲突。

如何打开文件

例子

'#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 的权限)。注意,open函数在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);




分解

代码结果

第一个电话: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 从文件中读取前 3 个字节并将它们存储在缓冲区中,从文件的开头(偏移量 0)开始。然后偏移量更新为 3.
  • 第二次调用 read 读取从更新的偏移量 (3) 开始的接下来的 3 个字节,然后将偏移量更新为 6。
    ETC ...

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

此过程将继续,直到从文件中读取所有数据或发生错误。每次读取后缓冲区都以 null 终止,以确保它可以作为字符串打印。

问题

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]刪除
最新教學 更多>
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-04-02
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-04-02
  • 哪種在JavaScript中聲明多個變量的方法更可維護?
    哪種在JavaScript中聲明多個變量的方法更可維護?
    在JavaScript中聲明多個變量:探索兩個方法在JavaScript中,開發人員經常遇到需要聲明多個變量的需要。對此的兩種常見方法是:在單獨的行上聲明每個變量: 當涉及性能時,這兩種方法本質上都是等效的。但是,可維護性可能會有所不同。 第一個方法被認為更易於維護。每個聲明都是其自己的語句,使...
    程式設計 發佈於2025-04-02
  • 為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    網格超過身體,用100%grid-template-columns 為什麼在grid-template-colms中具有100%的顯示器,當位置設置為設置的位置時,grid-template-colly修復了? 問題: 考慮以下CSS和html: class =“ snippet-code”> ...
    程式設計 發佈於2025-04-02
  • 如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    為有效的slug生成首先,該函數用指定的分隔符替換所有非字母或數字字符。此步驟可確保slug遵守URL慣例。隨後,它採用ICONV函數將文本簡化為us-ascii兼容格式,從而允許更廣泛的字符集合兼容性。 接下來,該函數使用正則表達式刪除了不需要的字符,例如特殊字符和空格。此步驟可確保slug僅包...
    程式設計 發佈於2025-04-02
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-04-02
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-04-02
  • 如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求模擬瀏覽器行為,以及偽造的用戶代理提供了一個用戶 - 代理標頭一個有效方法是提供有效的用戶式header,以提供有效的用戶 - 設置,該標題可以通過browser和Acterner Systems the equestersystermery和操作系統。通過模仿像Chro...
    程式設計 發佈於2025-04-02
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-04-02
  • 您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    在javascript console 中顯示顏色是可以使用chrome的控制台顯示彩色文本,例如紅色的redors,for for for for錯誤消息? 回答是的,可以使用CSS將顏色添加到Chrome和Firefox中的控制台顯示的消息(版本31或更高版本)中。要實現這一目標,請使用以下...
    程式設計 發佈於2025-04-02
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-04-02
  • 如何在php中使用捲髮發送原始帖子請求?
    如何在php中使用捲髮發送原始帖子請求?
    如何使用php 創建請求來發送原始帖子請求,開始使用curl_init()開始初始化curl session。然後,配置以下選項: curlopt_url:請求 [要發送的原始數據指定內容類型,為原始的帖子請求指定身體的內容類型很重要。在這種情況下,它是文本/平原。要執行此操作,請使用包含以下標頭...
    程式設計 發佈於2025-04-02
  • 如何配置Pytesseract以使用數字輸出的單位數字識別?
    如何配置Pytesseract以使用數字輸出的單位數字識別?
    Pytesseract OCR具有單位數字識別和僅數字約束 在pytesseract的上下文中,在配置tesseract以識別單位數字和限制單個數字和限制輸出對數字可能會提出質疑。 To address this issue, we delve into the specifics of Te...
    程式設計 發佈於2025-04-02
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-04-02
  • 為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    查詢模式實現缺失:解決“無法找到”錯誤在銀光應用程序中,嘗試使用LINQ建立錯誤的數據庫連接的嘗試,無法找到以查詢模式的實現。 ”當省略LINQ名稱空間或查詢類型缺少IEnumerable 實現時,通常會發生此錯誤。 解決問題來驗證該類型的質量是至關重要的。在此特定實例中,tblpersoon可能...
    程式設計 發佈於2025-04-02

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3