文件的描述符和重定向
- C语言的文件读写操作
- 代码
- open系统打开文件方法
- 系统读写文件操作
- 文件描述符
- 文件重定向
- 怎么理解文件缓冲区
C语言的文件读写操作
文件写入
fputs
int fputs(const char *s, FILE *stream);
s:要写入的字符串
stream:要写入对应的目标文件
文件输出(只可以在文件读的环境下运行 r)
fgets
char *fgets(char *s, int size, FILE *stream);
s:要保存到的目标位置
size:输出多少字节
stream:输出的目标文件
文件写入
**fprintf
int fprintf(FILE *stream, const char *format, …);
stream:写入的目标文件
format:要写入的字符串
…:代表可以写入多组
snprintf
(将字符串写入数组,不是文件写入)**
int snprintf(char *str, size_t size, const char *format, …);
str:需要存入目标数组
size:存取多大
format:对应的字符串目标
二进制文件的输出输入
fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
文件写入
fscanf函数会从文件输入流中读入数据,存储到format中,遇到空格和换行时结束。
fscanf
int fscanf(FILE *stream, const char *format, …);
stream:写入对应目标文件
代码
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#define LOG "log.text"
int main()
{//w:默认为写方式打开文件,如果文件不存在,就会创建出来FILE* fp = fopen(LOG,"w");if(fp == NULL){perror("fopen");return 1;}//正常进行文件操作const char* msg = "hello new file";int cnt = 1;char buffer[256];while(cnt){//C语言文件写操作//snprintf(buffer,sizeof(buffer),"%s:%d:wh\n",msg,cnt);//printf("%s",buffer);//fprintf(fp,"%s : %d : wh\n",msg,cnt);//fprintf(stdout,"%s : %d : wh",msg,cnt); //fprintf(stdout,msg,NULL);//Linux一切皆文件,stdout也对应一个文件,显示器文件 fputs(msg,fp);--cnt;}char line[128];//只可以在读的环境下读取 rif(fgets(line,sizeof(line),fp) == NULL){perror("fgets");}else printf("%s",line);fclose(fp);return 0;
}
open系统打开文件方法
open
#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_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
- O_APPEND: 追加写
- O_TRUNC:清空文件所有内容
mode:给文件设置权限
系统读写文件操作
文件写入
write
#include <unistd.h>
ssize_t write(int fildes, const void *buf, size_t nbyte);
write返回写入多少个字节包括\0
文件读出
read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
close
#include <unistd.h>
int close(int fildes);
文件描述符
但用
open
打开或者创建一个文件的时候,系统会给我们返回一个整数,当返回 -1 时,说明创建文件失败,反之创建成功,当创建成功时,也会给我们返回一个整数值,这个值我们称之为文件描述符
我们修改文件时,都会用到操作符。
那么文件描述符是什么呢?
文件描述符是一个数组下标,代表的意义不同。
Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入>0, 标准输出1, 标准错误2
0,1,2对应的物理设备一般是:键盘,显示器,显示器
所以当我们在新建文件后,每个文件对应的描述符都是3,这是因为前三个都被占用了
文件存储规则。
当标准输入、输出、错误都占用时,文件会顺的数组顺序进行保存,如果前0、1、2出现文件关闭时。那么当文件保存的时候就会优先前面空余的部分。
文件重定向
如果不想占用前三个,我们可以手动更改标准输入、输出、错误的路径,也可以通过函数
dup2
来更改。
linux重定向常见方式有:1、标准输入输出重定向,使用 ‘>’ 或 ‘>>’ 符号实现;2、标准错误重定向,使用 ‘2>’ 符号来实现;3、输入流重定向,使用 ‘<’ 符号实现;4、管道重定向,使用 ‘|’ 符号实现。
手动更改
dup2()函数修改
int dup2(int oldfd, int newfd);
oldfd覆盖nwefd
怎么理解文件缓冲区
显示器采用的刷新策略为行缓冲
文件采用的缓冲策略为全缓冲