嵌入式Linux:文件I/O和標準I/O庫
文件 I/O (Input/Output)和標準 I/O 庫是用于在 C 語(yǔ)言中進(jìn)行文件操作的兩種不同的方法。
1文件I/O
文 I/O(Input/Output)是指程序與文件之間進(jìn)行數據交換的過(guò)程。在計算機編程中,文件 I/O 是通過(guò)讀取和寫(xiě)入文件來(lái)實(shí)現數據的輸入和輸出操作。文件 I/O 主要涉及打開(kāi)文件、讀取文件內容、寫(xiě)入文件內容和關(guān)閉文件等操作。
常見(jiàn)文件 I/O 操作包括使用系統調用(如 open()、read()、write()、close())來(lái)進(jìn)行文件操作。通過(guò)文件 I/O,程序可以從文件中讀取數據,對數據進(jìn)行處理,然后將結果寫(xiě)入文件中,實(shí)現數據的持久化存儲和處理。
在Linux系統中,一切皆文件是其核心設計理念之一,因此文件I/O操作在Linux系統中顯得尤為重要。
1.1、文件描述符
文件描述符是操作系統中用于標識打開(kāi)文件的整數值。它是進(jìn)程與文件之間的橋梁,允許進(jìn)程對文件進(jìn)行讀取、寫(xiě)入和其他操作。在Linux系統中,每個(gè)打開(kāi)的文件都與一個(gè)文件描述符相關(guān)聯(lián),這個(gè)文件描述符是一個(gè)非負整數,通常是從0開(kāi)始遞增的。
文件描述符直接與操作系統的文件表項相關(guān)聯(lián),是操作系統提供的抽象。
舉例來(lái)說(shuō),假設我們有一個(gè)C語(yǔ)言程序,打開(kāi)了一個(gè)名為“example.txt”的文本文件進(jìn)行讀取。在這個(gè)程序中,文件描述符是用于表示這個(gè)打開(kāi)的文件的整數值。當程序調用open函數打開(kāi)文件時(shí),操作系統會(huì )分配一個(gè)文件描述符,并將其返回給程序。程序可以使用這個(gè)文件描述符執行讀取操作,如讀取文件內容并將其輸出到終端上。
#include#include#include
int main() { int fd; // 文件描述符 char buf[1024]; // 用于存儲讀取的數據
// 打開(kāi)文件 example.txt fd = open("example.txt", O_RDONLY); if (fd == -1) { perror("open"); return 1; }
// 讀取文件內容并輸出到終端上 ssize_t bytes_read; while ((bytes_read = read(fd, buf, sizeof(buf))) > 0) { write(STDOUT_FILENO, buf, bytes_read); }
// 關(guān)閉文件 close(fd);
return 0;}
在這個(gè)示例中,open函數打開(kāi)文件example.txt并返回一個(gè)文件描述符,然后read函數使用這個(gè)文件描述符來(lái)從文件中讀取數據。最后,close函數關(guān)閉文件,并釋放對應的文件描述符。
1.2、open打開(kāi)文件
在Linux系統中,操作文件需要先打開(kāi)它以獲取文件描述符,然后進(jìn)行讀寫(xiě)或其他操作,最后關(guān)閉文件。open函數可用于打開(kāi)現有文件或創(chuàng )建新文件。函數原型如下所示:
#include#include#include
int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);
函數的參數和返回值含義如下:
pathname:字符串類(lèi)型,用于標識需要打開(kāi)或創(chuàng )建的文件。它可以包含路徑信息,可以是絕對路徑或相對路徑,例如:"./src_file"(當前目錄下的 src_file 文件)或 "/home/dengtao/hello.c"。如果 pathname 是一個(gè)符號鏈接,open 函數會(huì )對其進(jìn)行解引用。
flags:調用 open 函數時(shí)需要提供的標志,包括文件訪(fǎng)問(wèn)模式標志以及其他文件相關(guān)標志。這些標志使用宏定義進(jìn)行描述,并都是常量。open 函數提供了豐富的標志選項,我們可以單獨使用某一個(gè)標志,也可以通過(guò)位或運算(|)將多個(gè)標志進(jìn)行組合。
mode:用于指定新建文件的訪(fǎng)問(wèn)權限,僅在flags參數中包含O_CREAT或O_TMPFILE標志時(shí)有效。在Linux系統中,權限對于文件是一個(gè)重要的屬性。我們可以使用touch命令在Linux系統中創(chuàng )建一個(gè)文件,此時(shí)文件會(huì )有默認的權限。如果需要修改文件權限,可以使用chmod命令進(jìn)行修改。例如,在Linux系統下,我們可以使用ls -l命令查看文件對應的權限。
返回值:成功將返回文件描述符,文件描述符是一個(gè)非負整數;失敗將返回-1。
open函數的flags參數用于指定打開(kāi)文件時(shí)的行為和權限。下面是一些常用的flags參數值:
O_RDONLY:只讀方式打開(kāi)文件。
O_WRONLY:只寫(xiě)方式打開(kāi)文件。
O_RDWR:讀寫(xiě)方式打開(kāi)文件。
O_CREAT:如果文件不存在,則創(chuàng )建文件。
O_EXCL:與O_CREAT一同使用,如果文件已經(jīng)存在,則返回錯誤。
O_TRUNC:如果文件存在且為只寫(xiě)或讀寫(xiě)打開(kāi),則將其長(cháng)度截斷為0。
O_APPEND:追加方式打開(kāi)文件,在寫(xiě)入數據時(shí)追加到文件末尾。
O_NONBLOCK:非阻塞方式打開(kāi)文件,在沒(méi)有數據可讀取時(shí)不阻塞。
O_SYNC:同步寫(xiě)入方式打開(kāi)文件,對寫(xiě)入文件的每個(gè)操作進(jìn)行同步。
O_DIRECT:直接IO方式打開(kāi)文件,繞過(guò)系統緩存,數據直接讀寫(xiě)到磁盤(pán)。
O_TMPFILE:創(chuàng )建一個(gè)臨時(shí)文件,文件在關(guān)閉時(shí)自動(dòng)刪除。
open函數的常用的mode參數:
S_IRUSR:文件所有者讀權限。
S_IWUSR:文件所有者寫(xiě)權限。
S_IXUSR:文件所有者執行權限。
S_IRGRP:文件組用戶(hù)讀權限。
S_IWGRP:文件組用戶(hù)寫(xiě)權限。
S_IXGRP:文件組用戶(hù)執行權限。
S_IROTH:其他用戶(hù)讀權限。
S_IWOTH:其他用戶(hù)寫(xiě)權限。
S_IXOTH:其他用戶(hù)執行權限。
在應用程序中使用 open 函數時(shí),需要包含 3 個(gè)頭文件“#include”、“#include”、“#include”。
下面是一個(gè)使用 open 函數的簡(jiǎn)單示例:
#include#include#include#include
int main() { const char *filename = "example.txt"; int fd;
// 使用 open 函數打開(kāi)文件,如果文件不存在,則創(chuàng )建 fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); }
// 向文件寫(xiě)入內容 if (write(fd, "Hello, World!", 13) == -1) { perror("write"); close(fd); exit(EXIT_FAILURE); }
// 關(guān)閉文件 if (close(fd) == -1) { perror("close"); exit(EXIT_FAILURE); }
printf("File created and written successfully.n");
return 0;}
在這個(gè)示例中:
我們首先定義了一個(gè)文件名 example.txt。
使用 open 函數打開(kāi)文件,使用 O_WRONLY 標志表示以只寫(xiě)方式打開(kāi)文件,O_CREAT 標志表示如果文件不存在則創(chuàng )建,O_TRUNC 標志表示如果文件存在則將其截斷為空文件,最后一個(gè)參數 S_IRUSR | S_IWUSR 指定了新創(chuàng )建文件的權限為用戶(hù)可讀可寫(xiě)。
如果 open 函數調用失敗,會(huì )打印錯誤消息并退出程序。
使用 write 函數向文件中寫(xiě)入內容。
最后使用 close 函數關(guān)閉文件。
1.3、write寫(xiě)文件
write 函數用于將數據寫(xiě)入文件。其函數原型如下:
#include
ssize_t write(int fd, const void *buf, size_t count);
函數的參數和返回值含義如下:
fd:文件描述符,代表要寫(xiě)入數據的文件。需要將要寫(xiě)入數據的文件對應的文件描述符傳遞給 write 函數。
buf:指定要寫(xiě)入數據的緩沖區。
count:指定要寫(xiě)入的字節數。
返回值:成功時(shí)返回寫(xiě)入的字節數(0 表示未寫(xiě)入任何字節)。如果返回值小于 count 參數,這不一定是錯誤,例如磁盤(pán)空間已滿(mǎn)可能導致未寫(xiě)入所有字節。如果寫(xiě)入出錯,則返回 -1。
對于普通文件,無(wú)論是讀取還是寫(xiě)入,一個(gè)關(guān)鍵問(wèn)題是確定從文件的哪個(gè)位置開(kāi)始進(jìn)行操作。即所謂的I/O操作位置偏移量。讀寫(xiě)操作都從文件的當前位置偏移量開(kāi)始。默認情況下,當前位置偏移量通常是0,即指向文件的起始位置。隨著(zhù)read、write函數的調用,當前位置偏移量也會(huì )相應移動(dòng)。例如,如果當前位置偏移量為1000字節,調用write()寫(xiě)入或read()讀取500字節后,當前位置偏移量將移動(dòng)到1500字節處。
使用 write 函數需要先包含 unistd.h 頭文件。
下面是一個(gè)示例代碼,將字符串寫(xiě)入文件:
#include#include#include
int main() { int fd = open("example.txt", O_WRONLY | O_CREAT, 0644); if (fd == -1) { perror("open"); return 1; }
const char *message = "Hello, world!"; ssize_t bytes_written = write(fd, message, strlen(message)); if (bytes_written == -1) { perror("write"); close(fd); return 1; }
close(fd); printf("Data written successfully.n"); return 0;}
在此示例中,我們首先打開(kāi)了一個(gè)文件 example.txt 以供寫(xiě)入,然后使用 write 函數將字符串 "Hello, world!" 寫(xiě)入文件中。
1.4、read讀文件
調用 read 函數可從打開(kāi)的文件中讀取數據,其函數原型如下所示:
#include
ssize_t read(int fd, void *buf, size_t count);
函數參數和返回值含義如下:
fd:文件描述符,用于標識要讀取的文件。
buf:用于存儲讀取數據的緩沖區。
count:需要讀取的字節數。
返回值:如果讀取成功,返回讀取到的字節數。實(shí)際讀取到的字節數可能小于請求的字節數,也可能為0,例如當文件已到達末尾時(shí)。
使用 read 函數需要先包含 unistd.h 頭文件。
例如,下面是一個(gè)簡(jiǎn)單的示例,從文件中讀取數據:
#include#include#include#include
#define BUF_SIZE 1024
int main() { int fd; ssize_t bytes_read; char buffer[BUF_SIZE];
// 打開(kāi)文件 fd = open("example.txt", O_RDONLY); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); }
// 讀取文件內容 bytes_read = read(fd, buffer, BUF_SIZE); if (bytes_read == -1) { perror("read"); exit(EXIT_FAILURE); }
// 輸出讀取的內容 write(STDOUT_FILENO, buffer, bytes_read);
// 關(guān)閉文件 close(fd);
return 0;}
這個(gè)示例打開(kāi)一個(gè)名為example.txt的文件,從中讀取數據并將其寫(xiě)入標準輸出。
1.5、close關(guān)閉文件
close 函數用于關(guān)閉一個(gè)已經(jīng)打開(kāi)的文件描述符,釋放對應的資源。在Linux系統中,文件描述符是有限資源,因此在不再需要使用文件時(shí),應該及時(shí)關(guān)閉,以釋放資源并避免資源泄漏。
函數原型如下所示:
#include
int close(int fd);
函數參數和返回值含義如下:
fd:文件描述符,需要關(guān)閉的文件所對應的文件描述符。
返回值:如果成功返回 0,如果失敗則返回-1。
使用 close 函數需要先包含頭文件。
以下是一個(gè)簡(jiǎn)單的示例,演示如何使用 close 函數關(guān)閉文件:
#include#include#include#include
int main() { // 打開(kāi)一個(gè)文件,獲取文件描述符 int fd = open("example.txt", O_RDONLY); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); }
// 關(guān)閉文件 if (close(fd) == -1) { perror("close"); exit(EXIT_FAILURE); }
printf("File closed successfully.n");
return 0;}
在這個(gè)例子中,首先通過(guò) open 函數打開(kāi)了一個(gè)文件,然后使用 close 函數關(guān)閉了文件描述符。perror 函數用于打印出發(fā)生錯誤的詳細信息。
除了使用 close 函數顯式關(guān)閉文件之外,在 Linux 系統中,當一個(gè)進(jìn)程終止時(shí),內核會(huì )自動(dòng)關(guān)閉它打開(kāi)的所有文件。這意味著(zhù)如果一個(gè)程序在退出時(shí)沒(méi)有關(guān)閉已打開(kāi)的文件,內核會(huì )代為關(guān)閉這些文件。許多程序都依賴(lài)于這一特性,因此沒(méi)有顯式地使用 close 函數來(lái)關(guān)閉文件。
然而,顯式關(guān)閉不再需要的文件描述符通常是良好的編程習慣。這樣做可以提高代碼的可讀性和可靠性,并確保在后續修改時(shí)代碼的行為符合預期。此外,釋放不再需要的文件描述符可以有效地管理有限的系統資源。
2
標準I/O庫
標準I/O庫是C語(yǔ)言中用于進(jìn)行輸入和輸出操作的標準庫之一。它提供了一組函數和數據結構,用于與文件、終端設備、管道等進(jìn)行交互,使得程序可以方便地進(jìn)行輸入和輸出操作,而無(wú)需直接操作文件描述符。
標準I/O庫函數構建在文件I/O系統調用(如 open()、read()、write()、lseek()、close() 等)之上。例如,fopen() 利用 open() 系統調用打開(kāi)文件,fread() 利用 read() 系統調用讀取文件,fwrite() 利用 write() 系統調用寫(xiě)入文件等。
盡管標準I/O和文件I/O都是C語(yǔ)言函數,但它們有明顯區別:
標準 I/O 是標準 C 庫函數,而文件 I/O 是 Linux 系統調用;
標準 I/O 是文件 I/O 的封裝,實(shí)際上調用文件 I/O 完成操作;
可移植性方面,標準 I/O 更優(yōu),因為不同操作系統的系統調用接口不同,而標準 I/O 接口幾乎相同;
在性能和效率方面,標準 I/O 由于維護自己的緩沖區,性能更高,而文件 I/O 在用戶(hù)空間無(wú)緩存。
標準I/O庫通常包含在C標準庫中,其函數和數據結構被定義在頭文件中。一些常用的標準I/O函數包括fopen、fclose、fread、fwrite、fprintf、fscanf等。所以使用時(shí)候需要在程序源碼中包含頭文件。
標準I/O庫的主要特點(diǎn)包括:
緩沖機制:標準I/O庫通常使用緩沖區來(lái)提高性能。例如,在輸出時(shí),數據首先寫(xiě)入到緩沖區,然后在適當的時(shí)機才會(huì )被刷新到實(shí)際的輸出設備上,從而減少了系統調用的次數,提高了效率。
格式化輸入輸出:標準I/O庫提供了格式化輸入輸出的功能,例如printf和scanf函數允許以特定格式輸出和輸入數據,使得數據的處理更加方便。
文件操作:標準I/O庫提供了一系列函數用于文件的打開(kāi)、關(guān)閉、讀取、寫(xiě)入等操作,例如fopen、fclose、fread、fwrite等。
錯誤處理:標準I/O庫提供了一套錯誤處理機制,允許程序員檢測和處理輸入輸出操作中可能出現的錯誤情況。
使用標準I/O庫可以使得程序更加可移植,因為它們提供了對底層系統調用的封裝,使得程序不依賴(lài)于特定的操作系統或文件系統。因此,標準I/O庫是C語(yǔ)言中進(jìn)行文件操作和輸入輸出的主要方式之一。
2.1、FILE指針
標準I/O庫函數操作圍繞FILE指針展開(kāi)。調用標準I/O庫函數打開(kāi)或創(chuàng )建文件時(shí),返回一個(gè)指向FILE類(lèi)型對象的指針(FILE *),該指針與被打開(kāi)或創(chuàng )建的文件相關(guān)聯(lián),用于后續的標準I/O操作。因此,FILE指針在標準I/O庫中扮演了與文件描述符類(lèi)似的角色,但用于更高級別的操作。
FILE結構體包含了標準I/O庫函數所需的所有文件管理信息,如文件描述符、文件緩沖區指針、緩沖區長(cháng)度、當前緩沖區字節數以及出錯標志等。
當使用標準I/O庫函數打開(kāi)或創(chuàng )建文件時(shí),會(huì )返回一個(gè)指向FILE類(lèi)型對象的指針,該指針與被打開(kāi)或創(chuàng )建的文件相關(guān)聯(lián)。下面是一個(gè)簡(jiǎn)單的示例:
#include
int main() { FILE *file_ptr;
// 使用標準I/O庫函數打開(kāi)文件 file_ptr = fopen("example.txt", "w"); if (file_ptr == NULL) { printf("Failed to open file.n"); return 1; }
// 使用 FILE 指針進(jìn)行寫(xiě)入操作 fprintf(file_ptr, "Hello, world!n");
// 關(guān)閉文件 fclose(file_ptr);
return 0;}
在這個(gè)示例中,file_ptr指針與文件相關(guān)聯(lián),用于后續的標準I/O操作(寫(xiě)入操作)。通過(guò)FILE指針,我們可以方便地進(jìn)行文件的讀寫(xiě)操作,而不必直接操作文件描述符和底層的文件系統。
2.2、fopen打開(kāi)文件
fopen() 是C語(yǔ)言標準庫中用于打開(kāi)文件的函數之一。它的原型如下:
FILE *fopen(const char *filename, const char *mode);
函數參數和返回值含義如下:
path:參數 path 是一個(gè)指向文件路徑的指針,可以是文件的絕對路徑或相對路徑。這個(gè)路徑指定了要打開(kāi)或創(chuàng )建的文件的位置和名稱(chēng)。
mode:參數 mode 是一個(gè)字符串,指定了對文件的讀寫(xiě)權限。它描述了打開(kāi)或創(chuàng )建文件時(shí)所需的操作類(lèi)型。常見(jiàn)的模式包括:
"r":只讀模式,用于打開(kāi)一個(gè)已存在的文本文件,文件必須存在。
"w":寫(xiě)入模式,用于創(chuàng )建一個(gè)新的空文本文件,如果文件已存在,則刪除其內容。
"a":追加模式,用于打開(kāi)一個(gè)文本文件以便寫(xiě)入,如果文件不存在,則創(chuàng )建文件,文件指針被放在文件的末尾。
"r+":讀寫(xiě)模式,用于打開(kāi)一個(gè)文本文件用于讀取和寫(xiě)入,文件必須存在。
"w+":讀寫(xiě)模式,用于創(chuàng )建一個(gè)新的空文本文件用于讀取和寫(xiě)入,如果文件已存在,則刪除其內容。
"a+":讀寫(xiě)模式,用于打開(kāi)一個(gè)文本文件用于讀取和寫(xiě)入,如果文件不存在,則創(chuàng )建文件,文件指針被放在文件的末尾。
返回值:函數調用成功時(shí),返回一個(gè)指向 FILE 類(lèi)型對象的指針(FILE *),該指針與打開(kāi)或創(chuàng )建的文件相關(guān)聯(lián)。后續的標準 I/O 操作將圍繞這個(gè) FILE 指針進(jìn)行。如果函數調用失敗,則返回 NULL,并設置 errno 以指示錯誤原因。
以下是一個(gè)簡(jiǎn)單的示例,演示了如何使用 fopen() 打開(kāi)文件:
#include
int main() { FILE *file_ptr;
// 以只讀模式打開(kāi)文件 file_ptr = fopen("example.txt", "r"); if (file_ptr == NULL) { printf("Failed to open file.n"); return 1; }
// 在這里可以進(jìn)行文件讀取操作
// 關(guān)閉文件 fclose(file_ptr);
return 0;}
在這個(gè)示例中,我們嘗試以只讀模式打開(kāi)名為 example.txt 的文件。如果文件打開(kāi)失敗,則會(huì )打印一條消息并退出程序。否則,我們可以在之后的代碼中對文件進(jìn)行讀取操作。最后,我們使用 fclose() 函數關(guān)閉文件,釋放資源。
2.3、fwrite寫(xiě)文件
fwrite() 是C語(yǔ)言標準庫中用于向文件寫(xiě)入數據的函數之一。它的原型如下:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
函數參數和返回值含義如下:
ptr:參數 ptr 是一個(gè)指向緩沖區的指針,該緩沖區中存儲了要寫(xiě)入到文件中的數據。函數將會(huì )把這個(gè)緩沖區中的數據寫(xiě)入到文件中。
size:參數 size 指定了每個(gè)數據項的字節大小,即每次寫(xiě)入的數據的大小。
nmemb:參數 nmemb 指定了寫(xiě)入的數據項的個(gè)數,即要寫(xiě)入到文件中的數據項的數量。
stream:參數 stream 是一個(gè)指向 FILE 結構的指針,它標識了要寫(xiě)入數據的文件。
返回值:調用成功時(shí),fwrite() 函數返回實(shí)際成功寫(xiě)入到文件中的數據項的數目。如果發(fā)生錯誤,則返回值可能小于參數 nmemb(或者等于 0)。
fwrite() 函數返回成功寫(xiě)入的數據項數目,如果返回值與 nmemb 不同,則表示寫(xiě)入出現了錯誤。
以下是一個(gè)簡(jiǎn)單的示例,演示了如何使用 fwrite() 向文件寫(xiě)入數據:
#include
int main() { FILE *file_ptr; char buffer[] = "Hello, world!";
// 打開(kāi)文件以便寫(xiě)入 file_ptr = fopen("example.txt", "w"); if (file_ptr == NULL) { printf("Failed to open file.n"); return 1; }
// 向文件寫(xiě)入數據 size_t num_written = fwrite(buffer, sizeof(char), sizeof(buffer), file_ptr); if (num_written != sizeof(buffer)) { printf("Failed to write to file.n"); fclose(file_ptr); return 1; }
// 關(guān)閉文件 fclose(file_ptr);
return 0;}
在這個(gè)示例中,我們向文件 "example.txt" 寫(xiě)入了字符串 "Hello, world!"。首先我們打開(kāi)文件以便寫(xiě)入,然后使用 fwrite() 函數將數據寫(xiě)入文件,最后關(guān)閉文件。
2.4、fread讀文件
fread() 是C語(yǔ)言標準庫中用于從文件讀取數據的函數之一。它的原型如下:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函數參數和返回值含義如下:
ptr:fread() 函數將讀取到的數據存放在參數 ptr 指向的緩沖區中。這個(gè)緩沖區是用來(lái)存儲從文件中讀取的數據的。
size:fread() 函數從文件讀取 nmemb 個(gè)數據項,每個(gè)數據項的大小為 size 個(gè)字節。因此,總共讀取的數據大小為 nmemb * size 個(gè)字節。
nmemb:參數 nmemb 指定了要讀取的數據項的個(gè)數。
stream:參數 stream 是一個(gè)指向 FILE 結構的指針,它標識了要從中讀取數據的文件。
返回值:調用成功時(shí),fread() 函數返回成功讀取到的數據項的數目。如果發(fā)生錯誤或到達文件末尾,則返回值可能小于參數 nmemb。由于 fread() 無(wú)法區分文件結尾和錯誤,返回值小于 nmemb 時(shí),可以使用 ferror() 或 feof() 函數來(lái)進(jìn)一步判斷是發(fā)生了錯誤還是已經(jīng)到達了文件末尾。
fread() 函數返回成功讀取的數據項數目,如果返回值與 nmemb 不同,則表示讀取出現了錯誤。
以下是一個(gè)簡(jiǎn)單的示例,演示了如何使用 fread() 從文件中讀取數據:
#include
int main() { FILE *file_ptr; char buffer[100]; // 緩沖區用于存儲讀取的數據
// 打開(kāi)文件以便讀取 file_ptr = fopen("example.txt", "r"); if (file_ptr == NULL) { printf("Failed to open file.n"); return 1; }
// 從文件讀取數據 size_t num_read = fread(buffer, sizeof(char), sizeof(buffer), file_ptr); if (num_read == 0) { printf("Failed to read from file.n"); fclose(file_ptr); return 1; }
// 輸出讀取的數據 printf("Read from file: %sn", buffer);
// 關(guān)閉文件 fclose(file_ptr);
return 0;}
在這個(gè)示例中,我們打開(kāi)了一個(gè)名為 "example.txt" 的文件以便讀取。我們使用 fread() 函數從文件中讀取數據,并將其存儲在名為 buffer 的緩沖區中。最后,我們打印出讀取到的數據,并關(guān)閉文件。
2.5、fclose關(guān)閉文件
fclose() 是C語(yǔ)言標準庫中用于關(guān)閉文件的函數之一。它的原型如下:
int fclose(FILE *stream);
函數參數和返回值含義如下:
stream:指向 FILE 結構的指針,標識要關(guān)閉的文件。
返回值:調用成功返回 0;失敗將返回 EOF(也就是-1)。
以下是一個(gè)示例,演示了如何使用 fclose() 關(guān)閉文件:
#include
int main() { FILE *file_ptr;
// 打開(kāi)文件以便讀取 file_ptr = fopen("example.txt", "r"); if (file_ptr == NULL) { printf("Failed to open file.n"); return 1; }
// 在這里可以進(jìn)行文件讀取操作...
// 關(guān)閉文件 if (fclose(file_ptr) != 0) { printf("Failed to close file.n"); return 1; }
return 0;}
在這個(gè)示例中,我們打開(kāi)了一個(gè)名為 "example.txt" 的文件以便讀取。在文件讀取操作完成后,我們使用 fclose() 函數關(guān)閉了文件。如果關(guān)閉文件失敗,則會(huì )打印一條錯誤消息并退出程序。
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。