【Linux】基础IO总结

C语言操作接口

在这里插入图片描述

1.打开

fopen

FILE *fopen(const char *path, const char *mode)

  • path :打开文件的方式(文件路径+文件名称)
  • mode: 以何种方式打开

r:以只读方式打开,当文件不存在时,就打开失败
r+:以读写方式打开,当文件不存在时,就会打开失败
w:以只写方式打开,如果文件不存在,则创建文件,如果文件存在,则会截断(清空)文件
w+: 以读写方式打开,如果文件不存在,则创建文件,如果文件存在,则会截断(清空)文件
a:以追加方式打开,只支持写,如果文件不存在,则创建文件,当前的文件流指针指向文件的末尾
a+:以追加方式打开,支持读和写,如果文件不存在,则创建文件,当前的文件流指向了文件的末尾

  • 返回值:打开成功返回文件流指针,打开失败返回null

2.写

fwrite

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

  • ptr: 要往文件中写的内容
  • size: 要写入块的大小,单位是字节
  • nmenb: 块的个数,单位是个, 写入的字节数量=size*nmemb
    一般在程序中使用的时候,讲size设置为1,nmemb就表示写入发字节数量
  • `stream``:文件流指针
  • 返回值:返回写成功的块的个数

3.读

fread

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

  • pre:将要读入的内容保存在哪里

  • size: 每次读块的大小

  • nmemb:块的个数

  • stream:文件流指针

  • 返回值:成功读到的块的个数

4.偏移

fseek

int fseek(FILE *stream, long offset, int whence);

  • stream:文件流指针

  • offset: 偏移量

  • whence:
    SEEK_SET
    SEEK_CUR
    ​SEEK_END

5.关闭

fclose

int fclose(FILE *fp);

  • 关闭文件流指针

举例1

写文件
#include <stdio.h>
#include <string.h>

int main()
{
	FILE *fd = fopen("myfile", "w");
	if(!fp){
		printf("fopen error!\n");
	}
	const char *msg = "hello!\n";
	int count = 5;
	while(count --){
		fwrite(msg, strlen(msg), 1, fp);
	}
	fclose(fp);
	return 0;
}

举例2

读文件
#include <stdio.h>
#include <string.h>

int main()
{
	FILE *fd = fopen("myfile", "r");
	if(!fp){
		printf("fopen error!\n");
	}
	char buf[1024];
	const char *msg = "hello!\n";
	while(1){
		//注意返回值和参数
		ssize_t s = fread(buf, 1, strlen(msg), fp);
		if(s > 0){
			buf[s] = 0;
			printf("%s", buf);
		}
		if(feof(fp)){
			break;
		}
	}
	fclose(fp);
	return 0;
}

系统调用操作接口

在这里插入图片描述

1.打开

open

int open(const char *pathname, int flags, mode_t mode);

  • pathname : 要打开的文件名称(路径+名称)

  • flags: 以何种方式打开

  • 必须的宏,三个,但只能出现一个

    O_RDONLY:只读方式
    O_WRONLY:只写方式
    O_RDWR:读写方式

  • 可选的宏
    ​ O_APPEND:追加
    ​ O_TRUNC:截断
    ​ O_CREAT:文件不存在创建

  • 使用方式,必须的宏和可选的宏之间使用按位或(eg:O_RDWR | O_CREAT)

  • mode权限
    ​ 新创建出来的文件设置权限
    ​ 传参的时候,传递八进制数字就可以
  • 返回值:
    ​ 打开成功,返回大于等于0的数字,是文件描述符
    ​ 打开失败,返回-1

2.写

write

ssize_t write(int fd, const void *buf, size_t count);

  • fd: 文件描述符,open的返回值

  • buf: 往文件里写的内容

  • count: 写的内容的大小

  • 返回值:写成功发字节数量

3.读

read

ssize_t read(int fd, void *buf, size_t count);

  • fd: 文件描述符,open的返回值

  • buf: 将要读到的内容放到那里去

  • count:最大可以读多少个,单位字节

  • 返回值:返回读到的字节数量

4.偏移

lseek

off_t lseek(int fd, off_t offset, int whence);

  • fd:文件描述符

  • offset:偏移量

  • whence
    ​ SEEK_SET
    ​ SEEK_CUR
    ​ SEEK_END

5.关闭

close

int close(int fd);

​ * 关闭文件描述符

举例1

写文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int mian()
{
	umask(0);
	//0644是初始权限
	int fd = open("myfile", O_WRONLY | 0_CREAT, 0644);
	if(fd < 0)
	{
		perror("open");
		return 1;
	}
	int count = 5;
	const char *msg = "hello\n";
	int len = strlen(msg);
	while(count --){
		write(fd, msg, len); //msg:缓冲区首地址,len:本次读取期望写入多少个自己的数据,返回值:实际写入了多少字节数据
	}
	fclode(fd);
	return 0;
}

举例2

读文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int mian()
{
	umask(0);
	//0644是初始权限
	int fd = open("myfile", O_RDONLY);
	if(fd < 0)
	{
		perror("open");
		return 1;
	}
	const char *msg = "hello\n";
	char buf[1024];
	while(1){
		ssize_t s = read(fd, buf, strlen(msg));
		if(s > 0){
			printf("%s", buf);
		}else{
			break;
		}
	}
	fclode(fd);
	return 0;
}

总结

在这里插入图片描述

  • 上述的fopen, fclose, fread, fwrite 都是C标准库当中的函数,称为库函数,而open ,close,read, write,lseek都属于系统提供的接口,称为系统调用接口
  • 系统调用接口和库函数的关系,可以认为f#系列的函数,都是对系统调用的封装,为了方便二次开发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风铃奈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值