文件描述符
文件描述符是系统分配给文件或套接字的整数。
标准输入、标准输出、标准错误在Linux中也被分配文件描述符。
文件描述符 | 对象 |
---|---|
0 | 标准输入:Standard Input |
1 | 标准输出:Standard Output |
2 | 标准错误:Standard Error |
文件或套接字一般经过创建过程才会被分配文件描述符,而三种输入输出对象即使未经特殊的创建过程,程序开始运行后也会被自动分配文件描述符。
打开文件
int open (const char *path, int flag);
path
:文件名的字符串地址flag
:文件打开模式返回值
:成功返回文件描述符,失败返回-1
打开模式 | 含义 |
---|---|
O_CREAT | 必要时创建文件 |
O_TRUNC | 删除全部现有数据 |
O_APPEND | 维持现有数据,保存到其后面 |
O_RDONLY | 只读打开 |
O_WRONLY | 只写打开 |
O_RDWR | 读写打开 |
关闭文件
int close(int fd)
fd
:需要关闭的文件或套接字的文件描述符返回值
:成功返回0,失败返回-1
将数据写入文件
ssize_t write(int fd, const void * buf, size_t nbytes)
fd
:显示数据传输对象的文件描述符buf
:保存要传输数据的缓冲区地址值nbytes
:要传输数据的字节数返回值
:成功返回写入的字节数,失败返回-1
size_t
是通过typedef声明的unsigned int类型,ssize_t
是通过typedef声明的signed int类型。
读取文件中数据
ssize_t read(int fd, const void * buf, size_t nbytes)
fd
:显示数据接收对象的文件描述符buf
:保存要接收数据的缓冲区地址值nbytes
:要接收数据的最大字节数返回值
:成功返回写入的字节数,失败返回-1
#low_open.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
void error_handling(char* messsage);
int main()
{
int fd;
char buf[] = "let's go!\n";
fd = open("data_write.txt", O_CREAT|O_WRONLY|O_TRUNC);
//文件不存在,创建空文件只能写。文件存在,则清空文件所有数据
if(fd == -1)
{
error_handing("open() error\n");
}
printf("file decriptor: %d\n", fd);
if((write(fd, buf, sizeof(buf)))== -1)
{
error_handling("write() error\n");
}
close(fd);
return 0;
}
void error_handling(char* messsage)
{
fputs(messsage, stderr);
fputc('\n', stderr);
exit(1);
}
#low_read.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFSIZE 100
void error_handling(char* messsage);
int main()
{
int fd;
char buf[BUFSIZE];
fd = open("data_read.txt",O_RDONLY);
if(fd == -1)
{
error_handling("open() error\n");
}
printf("file decriptor: %d\n", fd);
if(read(fd, buf, sizeof(buf)) == -1)
{
error_handling("read() error\n");
}
close(fd);
printf("file data : %s", buf);
return 0;
}
void error_handling(char* messsage)
{
fputs(messsage, stderr);
fputc('\n', stderr);
exit(1);
}