day26 文件io
函数接口
1 .open和close
文件描述符:系统为用open打开的文件分配的标识符
非负的整形数据
0-1023
最小未被使用原则
使用完时及时释放,避免文件描述符溢出
文件描述溢出就是文件使用完没有及时关闭文件
int open(const char *pathname, int flags); //打开一个已有文件
int open(const char *pathname, int flags,int mode);//O_CREAT + 权限
功能:
获得一个文件描述符
参数:
pathname:文件名
flags:
必flags:
O_RDONLY : 只读
O_WRONLY: 只写
O_RDWR : 读写
O_CREAT :不存在则创建
O_TRUNC : 清空文件
O_APPEND:追加写
"r" : O_RDONLY;
"r+" : O_RDWR ;
"w" : O_WRONLY | O_CREAT | O_TRUNC ; 0664
"w+" : O_RDWR | O_CREAT | O_TRUNC ; 0664
"a" : O_WRONLY | O_CREAT | O_APPEND; 0664
"a+" : O_RDWR | O_CREAT | O_APPEND; 0664
mode:对文件的操作权限
当flags中有 O_CREAT标志时,必须填写mode参数,一般加0664就好
返回值:
成功返回文件描述符 (最近最小未使用的一个数字)
文件描述符:系统为已打开的文件分配的标识符
非负的整形数据
0-1023
最小未被使用原则
使用完时及时释放,避免文件描述符溢出
失败返回-1
例 int fd = open("1.txt",O_WRONLY|O_CREAT,0666);
close(int fd);
默认打开流和描述符对应
int FILE *
STDIN_FILENO------->0 : 标准输入设备 -----》(stdin)
STDOUT_FILENO---->1 :标准输出设备 -----》(stdout)
STDERR_FILENO---->2:标准出错设备 -----》(stderr)
2.write和read
3.write
char buf[1024];
ssize_t write(int fd, const void *buf, size_t count);
功能:
//通过文件描述符向描述符指的文件中写一串数据,数据来源是buf
参数:
fd:文件描述符
buf:要写入文件的字符串的首地址
count:要写入字符的个数
返回值:
成功返回实际写入的个数
失败返回-1
4.read
ssize_t read(int fd, void *buf, size_t count);
功能:
通过文件描述符读取描述符指向的文件中的数据,放到buf、
参数:
fd:文件描述符
buf:存放数据空间的首地址
count:要读到数据的个数
返回值:
成功返回读到数据的个数
失败返回-1
读到文件结尾返回0
使用文件IO实现cat功能;
使用文件IO实现cp功能;
cat
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc , char *argv[])
{
int fp = open(argv[1],O_RDWR);
if(fp == -1)
{
printf("not open\n");
return -1;
}
char buff[1024] = {};
int ret = read(fp,buff,1024) ;
while(ret != 0)
{
write(1,buff,1024);
ret = read(fp,buff,1024);
}
close(fp);
}
copy
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc , char *argv[])
{
int fp = open(argv[1],O_RDWR);
int fq = open(argv[2],O_RDWR|O_TRUNC);
if(fp == -1 || fq == -1)
{
printf("not open\n");
return -1;
}
char buff[1024] = {};
int ret = read(fp,buff,1024) ;
while(ret != 0)
{
int rt = write(fq,buff,ret);
ret = read(fp,buff,1024);
}
close(fp);
close(fq);
}
3文件定位函数:lseek
off_t lseek(int fd, off_t offset, int whence);
功能:实现文件操作位置偏移
参数:
fd:描述符
offset:偏移量
whence:偏移的相对位置
SEEK_SET
SEEK_CUR
SEEK_END
返回值:
成功:返回文件当前操作位置到文件开头的偏移量
失败:-1
4.系统io和文件io
文件对底层操作,速度快,一般操作硬件对应的设备文件
标准io是在文件的基础上增加了缓冲区,提高对普通文件操作的效率。
5.缓冲区
输出缓冲区
行缓冲,1k, terminal,主要用于人机交互--- stdout ---终端
缓存区满或者遇到\n刷新1024
行缓存多是关于终端的一些操作
1.遇到 \n刷新(printf)
2.缓存区满刷新
3.程序结束刷新
4.fflush刷新 fflush(stdout); //强制刷新
全缓冲,4k,主要用于文件的读写 --- 普通文件的操作
缓存区满刷新缓存区 4096
对普通文件进行标准IO操作,建立
的缓存一般为全缓存
刷新条件:
1.缓存区满刷新(满4096刷新到文件内一次)
2.程序结束刷新
3.fflush来刷新 fflush(fp);
4.文件关闭刷新
无缓冲,0k 主要用于出错处理信息的输出 stderr
不对数据缓存直接刷新
printf();==>>stdout //有缓冲
fprintf(stderr,"fopen error %s",filename);//无缓冲
流stderr无缓冲
界面交互出错处理
原文地址:https://blog.csdn.net/qq_53671628/article/details/144776055
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!