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

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

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

在 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]刪除
最新教學 更多>
  • 如何將 Firebase 與 Laravel 集成
    如何將 Firebase 與 Laravel 集成
    Laravel and Firebase are two powerful tools that can significantly enhance the development of modern web applications. Laravel, a popular PHP framewor...
    程式設計 發佈於2024-11-07
  • Expo with Redux Toolkit、檔案系統與 Redux Persist:綜合指南
    Expo with Redux Toolkit、檔案系統與 Redux Persist:綜合指南
    Redux Toolkit 是一個流行的函式庫,它透過提供一組實用程式和約定來簡化 Redux 開發。它包括一個減速器和動作創建模式,可以簡化編寫 Redux 邏輯的過程。將 Redux Persist 與 Redux Toolkit 結合可以顯著提高 React Native 應用程式中狀態管理的...
    程式設計 發佈於2024-11-07
  • 如何處理非巢狀 Lambda 閉包中的變數作用域問題?
    如何處理非巢狀 Lambda 閉包中的變數作用域問題?
    Python Lambda 閉包作用域問題將變數封裝在閉包中以將其從函數簽章中刪除是一種常用於高效代碼結構的技術。但是,在非嵌套 lambda 的情況下,閉包保留變數的最終值,從而在嘗試基於迭代變數存取特定值時導致問題。 考慮提供的程式碼片段:names = ['a', 'b', 'c'] def ...
    程式設計 發佈於2024-11-07
  • 如何使用現代 CSS 將按鈕無縫整合到輸入欄位中?
    如何使用現代 CSS 將按鈕無縫整合到輸入欄位中?
    如何使用現代CSS 將按鈕整合到輸入中問題:創建視覺元素其中按鈕無縫整合在輸入欄位中,允許正常的使用者互動、保留文字可見性並保持可存取性和螢幕閱讀器相容性。 解決方案:Flexbox 和表單邊框最佳方法是使用彈性盒佈局以及包含元素(表單)上的邊框:定位:設定具有水平行佈局的彈性盒,允許輸入擴展以填充...
    程式設計 發佈於2024-11-07
  • 核心開發中的 C++:綜合指南
    核心開發中的 C++:綜合指南
    介紹 由於直接硬體存取和最小的運行時開銷,核心開發傳統上是 C 的領域。然而,由於其物件導向的特性,C 在核心程式設計中找到了自己的位置,這可以帶來更乾淨、更易於維護的程式碼。本指南將逐步介紹如何使用 C 進行核心開發,重點是設定環境、建置專案以及使用 C 功能編寫核心程式碼,同時...
    程式設計 發佈於2024-11-07
  • 在 React 專案中實作 CSS 模組
    在 React 專案中實作 CSS 模組
    React 中的 CSS 模組是一種透過自動產生唯一類別名稱來確定 CSS 範圍的方法。這可以防止大型應用程式中的類別名稱衝突並允許模組化樣式。以下是如何在 React 專案中使用 CSS 模組: 1. 設定 預設情況下,React 支援 CSS 模組。您只需使用擴展名 .modul...
    程式設計 發佈於2024-11-07
  • 有哪些資源可用於實現彗星模式?
    有哪些資源可用於實現彗星模式?
    Comet:伺服器推送模式伺服器推送是一種在伺服器和Web 用戶端之間實現雙向通訊的技術,已經獲得了顯著的成果最近的興趣。 Comet 設計模式是作為在 JavaScript 應用程式中實現伺服器推送的一種有前途的方法而出現。本問題探討了 Comet 模式的 jQuery 實作和通用資源的可用性。 ...
    程式設計 發佈於2024-11-07
  • 探索心理健康門診計畫的類型
    探索心理健康門診計畫的類型
    門診心理健康治療方法是一種不強調在醫療機構過夜的方案。這種療法主要在醫生辦公室、醫院或診所提供,在那裡人們可以進行定期治療,以進行高度結構化的定期治療。 在 COVID-19 大流行期間,全球約有 2.75 億名吸毒者。比前幾十年高出近 22%。吸毒成癮的增加導致全美吸毒過量人數創下歷史新高。好消...
    程式設計 發佈於2024-11-07
  • 如何在 C++ Builder 中初始化 OpenGL 幀:逐步指南
    如何在 C++ Builder 中初始化 OpenGL 幀:逐步指南
    如何在C Builder 中初始化OpenGL 幀在C Builder 中的窗體內初始化OpenGL 幀可能是一項具有挑戰性的任務。在嘗試調整現有 OpenGL 程式碼(例如問題中提供的範例)時,您可能會遇到困難。 要正確建立和渲染OpenGL 幀,請依照下列步驟操作:使用TForm::Handle...
    程式設計 發佈於2024-11-07
  • 利用這些罕見的 HTML 屬性來增強您的 Web 開發技能
    利用這些罕見的 HTML 屬性來增強您的 Web 開發技能
    Introduction HTML attributes are most often referred to as the overlooked heroes of web development, playing a crucial role in shaping the st...
    程式設計 發佈於2024-11-07
  • 如何在 Python 中將字串轉換為二進位:ASCII 與 Unicode?
    如何在 Python 中將字串轉換為二進位:ASCII 與 Unicode?
    在Python中將字串轉換為二進位在Python中,您可能會遇到需要將字串表示為二進位數字序列的情況。這對於多種原因都很有用,例如資料加密或二進位檔案操作。 使用 bin() 函數將字串轉換為二進位的最簡單方法就是使用bin()函數。該函數接受一個字串作為輸入,並將其二進位表示形式傳回為字串。例如:...
    程式設計 發佈於2024-11-07
  • 為什麼從 Java 中的匿名內部類別存取外部實例變數需要是 Final?
    為什麼從 Java 中的匿名內部類別存取外部實例變數需要是 Final?
    Java內部類別:為什麼必須使用「最終」外部實例變數在Java中定義匿名內部類別時,您可能會遇到將外部實例變數標記為“final”的要求。本文探討了這個約束背後的原因。 如同提供的程式碼中所提到的,實例變數 jtfContent 必須宣告為 Final 才能在內部類別中存取。這項要求源自於 Java...
    程式設計 發佈於2024-11-07
  • 理解 Python 中的關鍵字參數
    理解 Python 中的關鍵字參數
    When you're programming in Python, knowing how to pass arguments to functions is key for writing clear, flexible, and easy-to-maintain code. One powe...
    程式設計 發佈於2024-11-07
  • 如何防止列印時DIV跨頁分割?
    如何防止列印時DIV跨頁分割?
    列印問題:防止 DIV 跨頁分叉遇到動態 DIV 在頁面之間切成兩半的列印困境?當嘗試列印具有大量可變高度 DIV 元素的冗長文件時,就會出現此問題。 CSS 救援解決方案為了解決此問題,CSS 屬性打破了 -裡面來拯救。透過指定值避免,您可以確保渲染引擎防止 DIV 中途分割。這是程式碼片段:@m...
    程式設計 發佈於2024-11-07
  • Python 是強類型語言嗎?
    Python 是強類型語言嗎?
    Python 是強型別語嗎? Python 中的強型別概念造成了一些混亂,因為該語言允許變數改變執行期間的類型。然而,Python 確實是強型別的,儘管是動態的。 Python 中的強型別強型別可確保值維持其宣告的型別,除非明確轉換。在Python中,這意味著變數沒有固定的類型,而是它們所保存的值有...
    程式設計 發佈於2024-11-07

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

Copyright© 2022 湘ICP备2022001581号-3