目录
从Linux系统的角度看待文件
系统文件I/O
open
write
read
文件操作的本质
vim中批量注释的方法
从Linux系统的角度看待文件
关于文件的共识:
1.空文件也要占用磁盘空间
2.文件=内容+属性
3.文件操作包括文件内容/文件属性/文件内容+属性
4.文件路径+文件名具有唯一性
5.如果没有指明对应的文件路径,默认是在当前路径下对文件进行访问
故:文件操作的本质为:进程和被打开文件的关系
文件权限=0 666&~umask(默认文件掩码)
系统文件I/O
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);
pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
参数:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND: 追加写
返回值:
成功:新打开的文件描述符
失败:-1
write
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
c语言字符串以'\0'为结尾,与文件无关
//r w r+(读写,不存在则报错) w+(读写,不存在则创建)
//FILE* fp=fopen(FINE_NAME,"");
int fd=open(FINE_NAME,O_WRONLY|O_CREAT,0666);
if(fd<0)
{
perror("open");
return 1;
}
int cnt =5 ;
char outBuffer[64];
while (cnt)
{
sprintf(outBuffer,"%s:%d\n","test",cnt--);
write(fd,outBuffer,strlen(outBuffer));//strlen 不能+1 算上'\0' 会出现乱码
}
//printf("fd: %d\n",fd);
close(fd);
int fd=open(FINE_NAME,O_WRONLY|O_CREAT|O_TRUNC,0666);
O_TRUNC:对文件内容做清空
read
SYNOPSIS
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
char buffer[1024];
ssize_t num = read(fd,buffer,sizeof(buffer)-1);
if(num>0) buffer[num]=0;
printf("%s",buffer);
文件操作的本质
文件操作的本质为:进程和被打开文件的关系
进程可以打开多个文件-> 系统中存在大量的被打开的文件
OS管理被打开文件的方式是为其创建对应的内核数据结构(struct file)标识文件
struct file:中包含了文件的大部分属性。
#define FINE_NAME(number) "log.txt"#number
#:的作用是为了将log.txt与number拼接起来
int fd1 = open(FINE_NAME(1), O_WRONLY | O_CREAT | O_TRUNC, 0666);
int fd2 = open(FINE_NAME(2), O_WRONLY | O_CREAT | O_TRUNC, 0666);
int fd3 = open(FINE_NAME(3), O_WRONLY | O_CREAT | O_TRUNC, 0666);
int fd4 = open(FINE_NAME(4), O_WRONLY | O_CREAT | O_TRUNC, 0666);
int fd5 = open(FINE_NAME(5), O_WRONLY | O_CREAT | O_TRUNC, 0666);
printf("fd: %d\n", fd1);
printf("fd: %d\n", fd2);
printf("fd: %d\n", fd3);
printf("fd: %d\n", fd4);
printf("fd: %d\n", fd5);
close(fd1);
close(fd2);
close(fd3);
close(fd4);
close(fd5);
SYNOPSIS
#include <stdio.h>
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;
FILE* fp...;
FILE是一个结构体,其中有一个字段是文件描述符。
文件描述符的本质就是数组下标。
vim中批量注释的方法
ctrl+v+j+I+//+Esc
u:取消
fgets:在读取完字符串后会给字符串添加'\0'
int main()
{
//r w r+(读写,不存在则报错) w+(读写,不存在则创建)
FILE* fp=fopen(FINE_NAME,"");
return 0;
}
c语言中以w的形式打开文件,c会自动清空其内部的内容。