文件编程
基本流程
- 创建/打开一个文档
- 对文档进行编辑
- 保存文档
- 关闭文档
函数说明
- 创建/打开: open
- 读写: write/read
- 修改读写文件时指针位置: lseek
- 关闭: close
头文件
文件相关:
#include <fcntl.h>
#include <unistd.h>
前者包含了open函数
后者提供了各种I/O原语: read, write, close…
#include<sys/types.h>
#include<sys/stat.h>
前者提供类型pid_t, size_t的定义
后者中封装的函数,实现获取文件(普通文件,目录,管道,socket,字符,块 ) 的属性
open
open函数是uninx系统调用函数,返回的为文件描述符
fopen函数是C语言库函数,返回的是一个指向文件结构的指针
定义:
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname : 文件路径:相对路径或绝对路径
flags: 指定打开文件的操作,必须指定且只能指定一种常量
- O_RDONLY:只读模式
- O_WRONLY:只写模式
- O_RDWR:可读可写
还有一些其他的常量用于选择,需要与上面的选项通过按位或连接
( 例: O_RDWR**|**O_CREAT )
标志位 | 说明 |
---|
O_APPEND | 追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾 | O_CREAT | 如果指定文件不存在,则创建这个文件 | O_EXCL | 如果要创建的文件已存在,则出错,同时返回 -1,并且修改 errno 的值 | O_TRUNC | 如果文件存在,并且以只写、读写方式打开,则将其长度截断为0 | O_NOCTTY | 如果路径名指向终端设备,不要把这个设备用作控制终端 | O_NONBLOCK | 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式 | O_DSYNC | 等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新 | O_RSYNC | read 等待所有写入同一区域的写操作完成后再进行 | O_SYNC | 等待物理 I/O 结束后再 write,包括更新文件属性的 I/O |
**mode:**用于规定文件所有者、文件用户组及其他用户访问权限
mode_t是linux下的一个系统数据类型
mode
标志位 | 说明 |
---|
S_IRUSR | 文件所有者的读取权限位 | S_IWUSR | 文件所有者的写入权限位 | S_IXUSR | 文件所有者的执行权限位 | S_IRWXU | S_IRUSR|S_IWUSR|S_IXUSR | S_IRGRP | 文件用户组的读取权限位 | S_IWGRP | 文件用户组的写入权限位 | S_IXGRP | 文件用户组的执行权限位 | S_IRWXG | S_IRGRP|S_IWGRP|S_IXGRP | S_IROTH | 文件其他用户的读取权限位 | S_IWOTH | 文件其他用户的写入权限位 | S_IXOTH | 文件其他用户的执行权限位 | S_IRWXO | S_IROTH|S_IWOTH|S_IXOTH |
write & read
write函数:
ssize_t write(int fd, const void *buf, size_t count);
fd: 指向文件
*buf : 指向一块内存
count: 限定写入的字节数
read函数:
ssize_t read(int fd, void * buf, size_t count);
和write函数相同
注意:read时,若fd中的数据小于需要读取的数据,引起阻塞
lseek
函数原型:
off_t lseek(int fd, off_t offset, int whence);
lseek函数是通过与文件的偏移实现对文件的移动
**fd 😗*操作目标文件描述符
offset: 相对于whence的偏移量
whence: 基准,一般为SEEK_SET(文件指针开始),SEEK_CUR(文件指针当前位置),SEEK_END(文件指针尾)
函数返回值:文件读写指针距文件开头的字节大小,如果出错,返回-1
close
int close(int fd);
指定文件标识符,关闭
案例实现:
创建文件–>写内容–>读取 -->关闭
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main()
{
int tempFd = 0;
char tempFileName[20]= "csc8.txt";
tempFd = open(tempFileName, O_RDWR| O_TRUNC |O_EXCL, S_IRWXU| S_IRWXG);
if(tempFd == -1){
perror("file open error.\n");
exit(-1);
}
int tempLen = 0;
char tempBuf[100] = {0};
scanf("%s", tempBuf);
tempLen = strlen(tempBuf);
write(tempFd, tempBuf, tempLen);
close(tempFd);
tempFd = open(tempFileName , O_RDONLY);
if(tempFd == -1){
perror("file read error.\n");
exit(-1);
}
off_t tempFileSize = 0;
tempFileSize = lseek(tempFd, 0, SEEK_END);
lseek(tempFd, 0, SEEK_SET);
while(lseek(tempFd, 0, SEEK_CUR)!= tempFileSize){
read(tempFd, tempBuf, 1024);
printf("%s\n", tempBuf);
}
close(tempFd);
return 0;
}
流程:
编译&连接
打开文件&输入
csc8.txt
|