我们都知道在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里面读取了文件。
以上就是系统调用中简单的文件操作的函数。