Linux 标准 I/O(Standard I/O)库提供了一组函数,用于进行高级别的文件输入和输出操作。它建立在底层文件 I/O 系统调用之上,为开发者提供了更方便、更高级别的文件处理方式。以下是一些常用的 Linux 标准 I/O 库函数:
标准 I/O 使用 FILE
结构表示文件流,通过文件指针(FILE*
)进行操作。FILE
结构包含了文件的缓冲区、文件描述符、文件位置指示器等信息。
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;
}
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;
}
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;
}
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;
}
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;
}
标准 I/O 库使用缓冲区来提高性能。默认情况下,标准输入(stdin)和标准输出(stdout)是行缓冲的,而标准错误输出(stderr)是无缓冲的。
\n
时,缓冲区会被刷新。fflush
函数时,缓冲区会被刷新。#include <stdio.h>
int main() {
// 默认为行缓冲,当遇到换行符时,缓冲区被刷新
printf("Hello, "); // 不会立即输出
// 刷新缓冲区
fflush(stdout); // 输出 "Hello, "
// 全缓冲,缓冲区满时被刷新
printf("World!"); // 不会立即输出
// 刷新缓冲区
fflush(stdout); // 输出 "World!"
return 0;
}
标准输入输出重定向允许程序从不同的源读取输入或将输出发送到不同的目标。这在命令行中特别有用。
./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;
}
通过 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;
}
标准错误输出流 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 库更加灵活,适用于各种输入输出场景。