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

  • Post author:
  • Post category: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里面读取了文件。

以上就是系统调用中简单的文件操作的函数。



版权声明:本文为qq_43411563原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。