文件IO

本文介绍了Linux中不同类型的文件,包括普通文件、目录文件、设备文件等。同时,阐述了系统调用的作用以及流的概念,详细讲解了标准输入、输出和错误输出。文章还讨论了缓冲区的分类和刷新条件,并详细说明了标准IO操作,如fopen、fgetc、fgets等函数的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础概念:
1.linux文件的分类:
    普通文件      -
    目录文件    d
    套接字        s 
    块设备        b 
    字符设备    c 
    链接文件    l 
    管道文件    p 
2.系统调用
    概念:用户访问内核的接口
    
    作用:提高安全性
    
3.流的概念:
    所有的IO操作仅仅简单的从程序移进或移出,这种字节流,就是流.
    
    分类:
    文本流/二进制流 (Linux不区分);
    
    三个特殊流:(也会触发系统调用)                                (也是文件描述符)
    标准输入        键盘        stdin                                                          0
    标准输出        屏幕        stdout                                                        1
    标准错误输出    屏幕        stderr                                                      2

    每在linux下用键盘输入一个字符,就触发一次标准输入和标准输出
    
4.缓冲区
    是内存的一部分,是使内存预留的一部分空间.
    
    作用:解决速率不匹配问题
    
    缓冲区的分类:
    1)全缓冲:主要针对普通文件,没有'\n',一次性的全
        只有当缓冲区域满的时候,才会执行IO操作
    
    2)行缓冲:标准输入
        当缓冲区满或者遇到'\n',\n前的内容先刷新到缓冲区,\n后的内容遇到第二个\n才会刷新否则等到程序结束才刷新进缓冲区


    3)不缓冲:标准错误输出
        直接输出
        
    缓冲区的刷新条件:
    1.程序结束的时候,正常结束时,而不是被信号结束,要用return;
    2.缓冲区满的时候
    3.关闭文件的时候(关闭流关闭时)
    4.行缓冲(遇到 '\n');
    5.fflush();
        #include <stdio.h>

        int fflush(FILE *stream);
        //强制刷新缓冲区
        参数:流
        返回值:成功返回流,失败返回-1;
        
        
二\标准IO
1)打开文件
    fopen();
    #include <stdio.h>

    FILE *fopen(const char *pathname, const char *mode);
    FILE:每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE。
    
    参数:
    pathname:文件路径名
    mode:打开方式
       r     只读的方式打开,文件必须存在
       r+    读写方式打开,文件必须存在
       w     只写的方式打开,文件不存在则创建,存在则清空
       w+    读写的方式打开,文件不存在则创建,存在则清空
       a     追加写的方式打开,文件不存在则创建,存在则追加写
       a+    追加读写方式打开,文件不存在则创建,存在则追加写
    返回值:
    成功返回FILE指针,失败返回NULL


2)读写文件
    1.按字符读写 fgetc和fputc
        读:
        #include <stdio.h>

    int fgetc(FILE *stream);//从stream指定文件中读取一个字符,是一个函数
                            

    int getc(FILE *stream); 
    //从stream指定文件中读取一个字符,是一个宏

    int getchar(void);
    //从标准输入中读取一个字符
  
    返回值:
    成功返回一个字符
    失败或者读到文件末尾返回EOF;
    
    int feof(FILE *stream);
    //判断是否到达文件末尾
    
    返回值:如果检测到末尾指示器(end - of -file indicator)被设置,返回非0值

                如果检测不到末尾指示器(end - of -file indicator)被设置,返回值为0

                末尾指示器只能使用clearerr函数清除

    int ferror(FILE *stream);
    //判断是否出错
    
    返回值:出错返回非0;
    
    写:
       #include <stdio.h>

       int fputc(int c, FILE *stream);//向stram指定文件中写入一个字符,是一个函数

       int putc(int c, FILE *stream);
       //向stram指定文件中写入一个字符,是一个宏
    
       int putchar(int c);
       //向标准输出写入一个字符
       
       返回值:
       成功返回一个字符,失败EOF
       
    

    2.按行读写    fgets和fputs
    
    char *fgets(char *s, int size, FILE *stream);
    //从stream指定文件中读取一行数据,存放到s指定的内存中,
    

    //最多存size -1 个字符(因为不读尾零所以-1)
    //注意: 在读取数据的时候会连同'\n'一起读入到缓冲区中,在末尾补'\0'作为结束标志,当读到‘\n’或者文件结束符(EOF)会结束读取
    参数:
    s:缓冲区首地址
    size:实际读到的个数(也是返回的指针每次获得的字符量的大小,若size大于file中一行的字符数,则一次性得到这一行的全部字符)
    stream:流指针
    返回值:
    成功返回缓冲区首地址,如果在读取字符的过程中遇到EOF,则eof指示器被设置;如果未读入任何字符就遇到EOF,则 s 参数指向的位置保持原来的内容,返回值为NULL
    如果在读取的过程中发生了错误,则error指示器被设置,返回NULL,但是s参数指向的内容可能被改变


    
    char *gets(char *s)
    //默认从键盘读取一行数据到s指定的内存中,因为没有指定内存的大小,
    //容易造成内存泄漏,所以不安全
   

写:
       int fputs(const char *s, FILE *stream);
        //向stram指定文件中写入一行数据
        返回值:
        成功返回非0,失败EOF

       int puts(const char *s);
       //默认向标准输出写入一行字符,自动添加换行符.
    
    3.按块读写    fread和fwrite

    #include <stdio.h>

    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

    //从指定的文件中读取指定尺寸的数据
    //stram指定文件中读取一组数据,存放在ptr指向的内存中

    ptr:指向存放数据的内存块指针,该内存块的尺寸最小为size * nmemb 个字节

    size:指定要读取的每个元素的尺寸,最终的尺寸为size * nmemb

    nmemb:指定要读取的元素个数,最终的尺寸为size * nmemb

    stream:FILE对象的指针,指定一个带读取的文件流

   

    ptr从file中获得size * nmemb 的字符,若超过该行的字符数,用%s打印ptr会出现乱码

    但是一个一个打印ptr中的内容可以得到 size * nmemb 个有效字符,不能通过读得到

    ptr内的内容(存疑)

    参数:
    ptr:数据保存的首地址 
    size:读取数据的大小
    nmemb:对象个数
    stream:流指针 
    
    返回值:
    为实际读取到的元素个数,如果返回值比nmemb小,表示可能读取到文件末尾或者发生错误,可以用feof函数或者ferror函数作进一步的判断
    失败返回0;

写:    

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
    参数:与fread同
    ptr:数据保存的首地址  
    size:写入数据的大小
    nmemb:对象个数
    stream:流指针 

    返回值:
    成功返回实际写入的个数
    失败返回0;
       
3)关闭文件
    fclose(); //关闭流
    
4.流的定位和修改
       int fseek(FILE *stream, long offset, int whence);
       //修改文件指针当前的位置
       参数:
       stream:文件指针
       offset:相对于第三个参数的偏移量
       whence:第二个参数偏移的起始位置
            SEEK_SET ----    文件的起始位置
            SEEK_CUR ----    读或写指针当前的位置
            SEEK_END ----     文件结束的位置
       
       
       返回值:
       成功返回0失败返回-1

       long ftell(FILE *stream);
       //获取当前文件指针相对于文件起始位置的字节数
      
        返回值:
        相对于文件起始位置的偏移量,失败返回-1
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值