Linux系统编程笔记一文件编程

文件编程常用api

open()

打开文件操作
在man 2手册中查看open函数的使用法则

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

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

       int creat(const char *pathname, mode_t mode);

pathname:待打开、写入的文件路径名
flags:打开或读写文件的方式
mode:当创建新文件(在flags中使用了O_CREAT)时才使用,用于指定文件的访问权限

flags的常用类型有:
1,O_RDONLY :只读方式打开
2,O_WRONLY : 只写方式打开
3,O_RDWR : 可读可写方式打开

除了以上三种权限需指定一种,还有如下权限常数可选择使用:

1,O_CREAT 若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限
2,O_EXCL 如果同时制定了 O_CREAT,而文件已经存在,则出错
3,O_APPEND 每次写数据进入文件,都会加到文件的尾端
4,O_TRUNC 用该权限去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则在原来的数据后面加入新数据

文件描述符fd:
文件描述符(file descriptor)通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。
每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。

代码示例

int fd;//文件描述符
fd = open("./file1",O_PDWR);//以可读可写的方式打开file1文件

fd = open("./file1",O_RDWR|O_CREAT.0600);
//以可读可写的方式打开file1文件,并在file1文件不存在的时候新建此文件
//0600即为可读可写

fd = open("./file1",O_PDWR|O_EXCL);
//若此文件存在则报错
 
fd = open("./file1",O_PDWR|O_TRUNC);
// 若文件不存在则建立文件,若存在,则以可读可写的方式在文件后继续添加新数据

write()

写文件操作
在man 2手册中查看该函数的原型为

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

fd:文件描述符,函数返回的一个非负整数
buf:写文件时需要的缓冲区大小
count:输出最大字节数
返回值:写入文件成功的个数(成功);-1(出错)

示例代码

int fd;
char *buf = "write in file1 success";
//buf是无类型的指针常量,这里强制转换类型为char型
open("./file1",O_RDWR|O_CREAT.0600);
write(fd,buf,strlen(buf));
//这里不能使用strlen()函数
close(fd);
//关闭文件

read();

读文件操作
在man 2 手册中查找read();函数的原型

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

参数同write();函数相同
示例代码

int fd;
char *buf = "write in file1 success";
//buf是无类型的指针常量,这里强制转换类型为char型
open("./file1",O_RDWR|O_CREAT.0600);
int n_write = write(fd,buf,strlen(buf));
//这里不能使用strlen()函数

//创建读取的缓冲区
char *readBuf;	
// 读取文件内容缓冲区
readBuf = (char *)malloc(sizeof(char) * n_write);
//为读文件开辟空间
int n_read = read(int fd,readBuf,n_write);
//读取文件内容字节
printf("%s\n",n_read);
//打印读到的文件内容
close(fd);

lseek();

光标移位操作
在read()函数的使用中我们在写数据进文件时文件的光标其实已经移到了数据的尾端,在read()的过程中其实是从文件的尾端向前read()的,可以通过重新打开文件使光标的位置刷新到文件头,也可以通过linux自带的api lseek(0;函数来重新定位。
在 man 2 手册中查看函数的原型

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

fd:文件描述符
offset:偏移量
whence:固定点的位置
调用成功返回一个偏移值即文件头偏移了多少个字节
调用失败返回-1

whence的类型:
SEEK_SET:文件头
SEEK_GUR:文件当前的位置
SEEK_END:文件尾

示例代码

int fd;
char *buf = "write in file1 success";
//buf是无类型的指针常量,这里强制转换类型为char型
open("./file1",O_RDWR|O_CREAT.0600);
int n_write = write(fd,buf,strlen(buf));
//这里不能使用strlen()函数

//创建读取的缓冲区
char *readBuf;	
// 读取文件内容缓冲区
readBuf = (char *)malloc(sizeof(char) * n_write);
//为读文件开辟空间
lseek(fd,0,SEEK_SET);

int n_read = read(int fd,readBuf,n_write);
//读取文件内容字节
printf("%s\n",n_read);
//打印读到的文件内容
close(fd);

使用lseek()函数计算文件长度

int fd;
char *buf = "i am write";
fd = open("./file1",O_RDWR);
int long = lseek(fd,0,SEEK_END);
//利用函数返回的偏移值计算数据长度
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值