自学内容网 自学内容网

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
                      最小未被使用原则
                      使用完时及时释放,避免文件描述符溢出
失败返回-1int  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)!