【Linux】文件操作系统的调用函数

我们都知道在C语言中文件的函数有:fopen、fwrite、fclose、fseek、fread
这几个函数的文件原型以及参数如下所示:

FILE *fopen(const char *path,const *mode);
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
size_t fwrite(const void *ptr,size_t size, size_t nmemb,FILE *stream)
int flose(FILE *fp);
int fseek(FILE *stream,long offset, int whence);

此处的C语言的文件只是简单得进行说明,如果想详细了解请查看博客:
https://blog.csdn.net/qq_43411563/article/details/104523383
这篇博客我们主要说一下,Linux上系统调用的文件函数。
系统调用的函数有:open read write close lseek
一、函数原型和参数
我们都知道在Linux系统上可以直接查看函数的原型和参数。它主要运用到的是man这个命令

man 1 command:查看命令帮助手册
man 2 系统调用:查看系统调用手册
man 3 库函数:查看库函数的使用手册

1、open
利用命令 man 2 open查看后

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

(1)flags:操作方式(可以使用按位或的方式设置好几种操作方式)
操作方式主要有:O_RDONLY 、O_WRONLY 、O_RDWR 、 O_CREAT、O_APPEND(追加) 、O_TRUNC(清除)
(2)mode:设置创建文件的权限(只有在O_CREAT的情况下去使用)
2、read
利用命令 man 2 read查看后

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

(1)fd:open返回值(失败返回-1,成功返回>=0)
(2)buf:临时缓冲区的地址,用来存储从文件中读到的数据
(3)count:一次read最多读取的字节的长度,一般是缓冲区的大小。

3、write
利用命令 man 2 write查看后

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

(1)fd:open返回值(失败返回-1,成功返回>=0)
(2)buf:临时缓冲区的地址,用来存储从文件中读到的数据
(3)count:给定的是buf中真实数据长度,也就是想要写入文件中的数据长度
4、close
利用命令 man 2 close查看后

int close(int fd);

5、lseek
利用命令 man 2 lseek查看后

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

(1)offset:文件的偏移值
(2)whence:移动大小的相对位置。主要有三种,分别是:SEEK_SET、SEEK_CUR、SEER_END
二、编程实现将用户在界面上输入的数据存储到文件中,再将文件中的所有内容整体显示到用户界面上
我们在Linux上创建一个文件main.c,然后在里面写这样一段代码“

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include <fcnti.h>//操作文件时必须要填的头文件
int main()
{
	int fd = open("./a.txt",O_RDWR | O_CREAT, 0644)
	assert(-1!= fd);
	while(1)
	{
	printf("input: ");
	char buff[128] = {0};
	fgets(buff,127,stdin);//stdin标注输入,会把后面的回车符也放到buff
	if(strncmp(buff, "end", 3) == 0)
	{
		break;
	}

	int n = write(fd,buff,strlen(buff));
	if(n <= 0)
	{
	perror("write error: ");
	exit(0);
	}
	}
	printf("******a.txt:********\n");
	while(1)
	{
	char buff[128] = {0};
	int n = read(fd,buff,127);
	if( n == 0)
	{
	printf("END\n");
	break;
	}
	else if(n < 0)
	{
	perror("read error: ");
	exit(0);
	}
	else
	{
	printf("%s",buff);
	}
	}
	close(fd);
}

我们现在在Linux上执行一下这个代码,
在这里插入图片描述

这个时候我们发现确实也有一个a.txt这个文件,我们去看a.txt这个文件时,发现里面也有我们输入的内容。如下所示:
在这里插入图片描述
但是我们程序里面去打印这四行内容的时候没有打印出来,只有一个END。原因是:

  • 当我们们执行完前面的代码,文件的游标就会在文件的末尾。它是跟着这int n = write(fd,buff,strlen(buff));的write走的。
  • 而我们在进行下面的操作时并没有去操作它,而是直接进行了读取
  • int n = read(fd,buff,127);这句代码的fd还是在文件的末尾。所以是无法读到内容的。
    我只需要在读取之前做一些操作,加入这样一行代码
printf("******a.txt:********\n");
lseek(fd, 0 , SEEK_SET);

这个时候我们文件读写的偏移游标就到了起始的位置,这个时候我们就可以进行我们的读写了,我们重新编译一下,如下图所示:
在这里插入图片描述
就发现txt里面读取了文件。
以上就是系统调用中简单的文件操作的函数。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值