文件IO的概念:

什么是文件IO,又称系统IO,系统调用
是操作系统提供的API接口函数。
POSIX接口 (了解)
注意:文件IO不提供缓冲机制

文件IO的API

open close read read

文件描述符概念:

英文:缩写fd(file descriptor)
是0-1023的数字,表示文件。
0, 1, 2 的含义 标准输入,标准输出,错误

文件IO 打开

//open
int open(const char *pathname, int flags);   //不创建文件
int open(const char *pathname, int flags, mode_t mode); // 创建文件,不能创建设备文件
//成功时返回文件描述符;出错时返回EOF

文件IO和标准的模式对应关系:

r				O_RDONLY
r+				O_RDWR
w				O_WRONLY | O_CREAT | O_TRUNC, 0664
w+				O_RDWR | O_CREAT | O_TRUNC, 0664
a				O_WRONLY | O_CREAT | O_APPEND, 0664
a+				O_RDWR | O_CREAT | O_APPEND, 0664

umask概念:
umask 用来设定文件或目录的初始权限

文件的关闭
int close(int fd)
关闭后文件描述符不能代表文件

文件IO的读写和定位

容易出错点:
求字符串长度使用sizeof,对二进制数据使用strlen
printf 的字符最后没有’\0’

文件读取

#including <unistd.h>
ssize_t read(int fd, void *buf, size_f count);

成功时返回实际读取的字节数;出错时返回EOF
读到文件末尾时返回0
buf时接收数据的缓冲区
count不应超过buf大小

read-示例
从指定的文件(文本文件)中读取内容并统计大小

int main(int argc, char *argv[]){
	int fd, n, total = 0;
	char buf[64];
	if(argc < 2){
		printf("Usage:%s<file>\n",argv[0]);
		return -1;
	}
	if((fd = open(argv[1],O_RDONLY)) < 0){
		perror("open");
		return -1;
	}
	while((n = read(fd, buf, 64)) > 0){
		total += n;
	}
	......

文件写入-write

#include <unistd.h>
ssize_t write(int fd, void *buf, size_t count);

成功时返回实际写入的字节数;出错时返回EOF
buf时发送数据的缓冲区
count不应超过buf大小

write-示例
将键盘输入的内容写入文件,直到输入quit

int fd;
char buf[20];
if((fd = open(argv[1], O_WRONLY|O_CREAT, 0666)) < 0){
	perror("open");
	return -1;
}
while(fgets(buf, 20, stdin) != NULL){
	if(strcmp(buf, "quit\n") == 0)
		break;
		write(fd, buf, strlen(buf));
}
......

文件定位-lseek

#include<unistd.h>
off_t lseek(int fd, off_t offset, intt whence);

成功时返回当前的文件读写位置;出错时返回EOF
参数offset和参数whence同fseek完全一样

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐