文件描述符
文件描述符是一个非负整数,用于在操作系统级别上唯一标识打开的文件、设备或其他输入/输出资源。文件描述符通常用于低级(系统)I/O操作,如read()
, write()
, select()
, 和 poll()
等系统调用。
例子:使用文件描述符
在C语言中,你可以使用open()
函数打开一个文件,该函数返回一个文件描述符
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int fd; // 文件描述符
char buffer[128];
ssize_t bytesRead;
// 打开文件,返回文件描述符
fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("open");
return 1;
}
// 读取文件内容
bytesRead = read(fd, buffer, sizeof(buffer) - 1);
if (bytesRead == -1) {
perror("read");
close(fd); // 关闭文件描述符
return 1;
}
// 确保字符串以null结尾
buffer[bytesRead] = '\0';
// 输出读取到的内容
printf("Read %zd bytes: %s\n", bytesRead, buffer);
// 关闭文件描述符
close(fd);
return 0;
}
文件指针
文件指针是一个指向FILE
结构体的指针,该结构体由C标准库中的stdio.h
定义。文件指针通常用于高级(标准)I/O操作,如fopen()
, fclose()
, fread()
, fwrite()
, fprintf()
, 和 fscanf()
等函数。
例子:使用文件指针
在C语言中,你可以使用fopen()
函数打开一个文件,该函数返回一个文件指针。
#include <stdio.h>
int main() {
FILE *fp; // 文件指针
char buffer[128];
size_t bytesRead;
// 打开文件,返回文件指针
fp = fopen("example.txt", "r");
if (fp == NULL) {
perror("fopen");
return 1;
}
// 读取文件内容
bytesRead = fread(buffer, 1, sizeof(buffer) - 1, fp);
if (ferror(fp)) { // 检查是否发生错误
perror("fread");
fclose(fp); // 关闭文件指针
return 1;
}
// 确保字符串以null结尾
buffer[bytesRead] = '\0';
// 输出读取到的内容
printf("Read %zu bytes: %s\n", bytesRead, buffer);
// 关闭文件指针
fclose(fp);
return 0;
}
文件描述符更接近于底层系统调用,而文件指针则提供了更高级别的封装和便利。