Linux 標準 I/O(Standard I/O)庫提供了一組函數,用于進行高級別的文件輸入和輸出操作。它建立在底層文件 I/O 系統調用之上,為開發者提供了更方便、更高級別的文件處理方式。以下是一些常用的 Linux 標準 I/O 庫函數:
1. 文件指針
標準 I/O 使用 FILE
結構表示文件流,通過文件指針(FILE*
)進行操作。FILE
結構包含了文件的緩沖區、文件描述符、文件位置指示器等信息。
2. 文件打開和關閉
-
FILE* fopen(const char* filename, const char* mode);
- 打開文件,并返回一個文件指針。
filename
是文件名。mode
指定打開文件的模式(例如:"r" - 只讀,"w" - 只寫,"a" - 追加,"r+" - 讀寫,"w+" - 讀寫,"a+" - 讀寫追加等)。
-
int fclose(FILE* stream);
- 關閉文件流,釋放相關資源。
- 關閉文件流,釋放相關資源。
#include <stdio.h>
int main() {
// 打開文件
FILE* file = fopen("example.txt", "r");
if (file != NULL) {
// 文件操作...
// 關閉文件
fclose(file);
} else {
perror("Error opening file");
}
return 0;
}
3. 文件讀寫
-
size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream);
- 從文件讀取數據到緩沖區。
ptr
是數據緩沖區的指針。size
是每個數據項的大小。nmemb
是要讀取的數據項數量。stream
是文件指針。
-
size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream);
- 將數據從緩沖區寫入文件。
ptr
是數據緩沖區的指針。size
是每個數據項的大小。nmemb
是要寫入的數據項數量。stream
是文件指針。
#include <stdio.h>
int main() {
FILE* file = fopen("example.txt", "w");
if (file != NULL) {
// 寫入數據
const char* data = "Hello, Standard I/O!";
fwrite(data, sizeof(char), strlen(data), file);
// 關閉文件
fclose(file);
} else {
perror("Error opening file");
}
return 0;
}
4. 標準輸入輸出
-
int fprintf(FILE* stream, const char* format, ...);
- 將格式化的數據寫入文件。
-
int fscanf(FILE* stream, const char* format, ...);
- 從文件中讀取格式化的數據。
-
int printf(const char* format, ...);
- 將格式化的數據寫入標準輸出。
-
int scanf(const char* format, ...);
- 從標準輸入讀取格式化的數據。
- 從標準輸入讀取格式化的數據。
#include <stdio.h>
int main() {
FILE* file = fopen("example.txt", "w");
if (file != NULL) {
// 將格式化的數據寫入文件
fprintf(file, "The answer is: %d\n", 42);
// 關閉文件
fclose(file);
} else {
perror("Error opening file");
}
return 0;
}
5. 標準錯誤輸出
int perror(const char* s);
- 輸出一個錯誤消息。
- 輸出一個錯誤消息。
#include <stdio.h>
int main() {
FILE* file = fopen("nonexistent_file.txt", "r");
if (file == NULL) {
// 輸出錯誤消息
perror("Error opening file");
}
return 0;
}
6. 標準輸入輸出重定向
-
int fflush(FILE* stream);
- 刷新緩沖區。
-
int setvbuf(FILE* stream, char* buffer, int mode, size_t size);
- 設置文件流的緩沖區。
-
int fseek(FILE* stream, long offset, int whence);
- 移動文件位置指示器。
- 移動文件位置指示器。
#include <stdio.h>
int main() {
FILE* file = fopen("example.txt", "w");
if (file != NULL) {
// 寫入數據
fprintf(file, "Hello, Standard I/O!");
// 刷新緩沖區
fflush(file);
// 移動文件位置指示器
fseek(file, 0, SEEK_SET);
// 關閉文件
fclose(file);
} else {
perror("Error opening file");
}
return 0;
}
7. 標準輸入輸出緩沖
標準 I/O 庫使用緩沖區來提高性能。默認情況下,標準輸入(stdin)和標準輸出(stdout)是行緩沖的,而標準錯誤輸出(stderr)是無緩沖的。
- 行緩沖:當遇到換行符
\n
時,緩沖區會被刷新。 - 全緩沖:當緩沖區滿時,或者使用
fflush
函數時,緩沖區會被刷新。
#include <stdio.h>
int main() {
// 默認為行緩沖,當遇到換行符時,緩沖區被刷新
printf("Hello, "); // 不會立即輸出
// 刷新緩沖區
fflush(stdout); // 輸出 "Hello, "
// 全緩沖,緩沖區滿時被刷新
printf("World!"); // 不會立即輸出
// 刷新緩沖區
fflush(stdout); // 輸出 "World!"
return 0;
}
8. 標準輸入輸出重定向
標準輸入輸出重定向允許程序從不同的源讀取輸入或將輸出發送到不同的目標。這在命令行中特別有用。
-
標準輸入重定向:
./program < input.txt
- 程序從
input.txt
中讀取輸入。
- 程序從
-
標準輸出重定向:
./program > output.txt
- 程序將輸出寫入到
output.txt
。
- 程序將輸出寫入到
#include <stdio.h>
int main() {
// 從標準輸入讀取數據
int number;
scanf("%d", &number);
printf("You entered: %d\n", number);
// 將輸出重定向到文件
freopen("output.txt", "w", stdout);
printf("This will be written to output.txt\n");
return 0;
}
9. 標準輸入輸出流的復制
通過 dup
或 dup2
函數,可以復制文件描述符,實現標準輸入輸出流的重定向。
-
int dup(int oldfd);
- 復制文件描述符,返回新的文件描述符。
-
int dup2(int oldfd, int newfd);
- 復制文件描述符到指定的文件描述符,如果指定的文件描述符已經打開,則關閉它。
- 復制文件描述符到指定的文件描述符,如果指定的文件描述符已經打開,則關閉它。
#include <stdio.h>
#include <unistd.h>
int main() {
// 復制標準輸出流到文件描述符 3
int newfd = dup(STDOUT_FILENO);
// 輸出到標準輸出和新的文件描述符
printf("Hello, Standard Output!\n");
dprintf(newfd, "Hello, New File Descriptor!\n");
// 關閉新的文件描述符
close(newfd);
return 0;
}
10. 標準錯誤輸出
標準錯誤輸出流 stderr
通常用于輸出程序運行時的錯誤消息。
#include <stdio.h>
int main() {
fprintf(stderr, "This is an error message.\n");
perror("An error occurred");
return 0;
}
以上是 Linux 標準 I/O 庫的一些高級特性,包括緩沖機制、輸入輸出重定向和文件描述符的復制。這些特性使得標準 I/O 庫更加靈活,適用于各種輸入輸出場景。