Linux C语言学习 新篇章 IO进程:day1

本文详细介绍了Linux环境下C语言的标准IO,包括概念、特点、缓存区管理和文件打开方式。重点讨论了标准IO的缓存策略,如全缓存、行缓存和不缓存,并提供了相关练习,如测试标准输出缓存区大小和实现基本的文件操作函数,如fopen、fclose、fgetc、fputc等。

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

【1】标准IO
  1. 概念:
    标准IO是指在C库中提供的一组专门用于输入输出的函数

  2. 特点:
    不仅在UNIX系统,在很多操作系统上都实现了标准I/O库
    标准I/O库由ANSI C标准说明
    标准I/O通过缓冲机制减少系统调用,实现更高效率    
    标准I/O在系统调用函数基础上构造的,它便于用户使用
    标准IO默认打开了三个流:stdin、stdout、stderr
    
  3. FILE:(文件流指针)
    每个被使用的文件都在内存中开辟一个区域,用来存放文件
    的有关信息,这些信息是保存在一个结构体类型的变量中,
    该结构体类型是由系统定义的,取名为FILE。
    标准I/O库的所有操作都是围绕流(stream)来进行的,
    在标准I/O中,流用FILE *来描述。
    
  4. 流:
    定义:所有的I/O操作仅是简单的从程序移进或者移出,
    这种字节流,就称为流

【2】缓存区:
  1.全缓存:与文件相关
    刷新缓存区的条件:
        1)程序正常退出
        2)缓存区满刷新
        3)fflush强制刷新
  2.行缓存:与终端相关
    刷新缓存区的条件:
        1)\n刷新
        2)程序正常退出
        3)缓存区满刷新
        4)fflush强制刷新
  3.不缓存:没有缓存区,stderr

练习:测试标准输出缓存区的大小

1Byte*1024=1K
Byte KB MB GB:
1GB = 1024MB
1MB = 1024KB
1KB = 1024Byte

【3】打开文件:
    FILE *fopen(const char *path, const char *mode);
    功能:打开文件
    参数:path:文件路径
          mode:打开文件的方式
            r:只读,文件不存在,会报错
            r+:可读可写,文件不存在,会报错
            w:只写,文件不存在创建,文件存在清空
            w+:可读可写,文件不存在创建,文件存在清空
            a:追加(可写),文件不存在创建,存在追加
            a+:可读可写,文件不存在创建,存在追加
    返回值:成功:返回文件流指针
            失败:NULL
            
    FILE *freopen(const char *pathname, const char *mode, FILE* fp)
    功能:将指定的文件流指针重定向到打开的文件中
    参数:path:文件路径
          mode:打开文件的方式(同上)
          fp:文件流指针
    返回值:成功:返回文件流指针
            失败:NULL    
    
    关闭文件:
    int fclose(FILE *fp);
    
    补充:
    void perror(const char *s);
    功能:当你调用“某些”函数出错时,会将参数 s 所指的字符串和错误的原因输出到标准设备。

    char *strerror(int errnum);
    功能:根据错误号返回错误原因字符串
    参数:errnum:errno号

    int fprintf(FILE *stream, const char *format, ...);
    功能:向指定的流中输出数据

          
练习:测试一个进程最多可以打开多少个文件    
        
【4】每次一个字符的读写:
    int fgetc(FILE *stream);
    功能:每次一个字符的读
    参数:stream:文件流指针
    返回值:成功:读到字符的ASCII
            失败或文件结尾:EOF(-1)
            
    int fputc(int c, FILE *stream);
    功能:向指定的文件中写一个字符
    参数:c 要写的字符
           stream  要写到的流
    返回值:成功:写入的字符;
            失败:EOF
            
练习:用fgetc和fputc实现cat的功能,从命令行输入文件名.                
    
【5】每次一行的IO:
    char *fgets(char *s, int size, FILE *stream);
    功能:从指定的流中读取最多size-1个字符,
        存放在s所指的空间
    参数:s    读到数据的存放位置
          size    一次期望读到的数据
          stream    流
    返回值:成功返回s的地址
            失败或读到文件结尾:NULL

    int fputs(const char *s, FILE *stream);
    功能:向指定的文件流中写入一串字符
    参数:s:要写入的字符内容
          stream  流
    返回值: 成功 实际写入的数据的个数
             失败 EOF
    注意:
        fgets最多可以读size - 1个,最后一个字符必须是'\0'字符
        fgets函数是每次读一行的函数,遇到'\n'字符返回

        
练习:用fgets实现wc –l的功能,文件名从命令行输入
*        buf:*\n\0   2-1=1
**        buf:**\n\0  3-1
***        buf:***\n\0
****    buf:****  buf:\n\0 
*****   buf:****  buf:*\n\0
******  buf:****\0 buf:**\n\0
        buf:\n\0

假设:size=5 
buf[strlen(buf)-1]

练习:用fgets和fputs实现cp的功能,两个文件名从命令行输入
    cp 文件1 文件2

【6】直接IO(二进制IO)
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    功能:从文件流读取多个元素
    参数:      ptr :用来存放读取元素
              size :元素大小  sizeof(数据类型)
              nmemb :读取元素的个数
                stream :要读取的文件
    返回值:成功:读取的元素的个数;读到文件尾: 0
            失败: -1
             
    size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
    功能:按对象写
    参数:同上    
    返回值:成功:写的元素个数
            失败 :-1

    注意:
        两个函数的返回值为:读或写的对象数
        对于二进制数据我们更愿意一次读或写整个结构

练习:通过fread和fwrite读写一个结构体数组

回顾:
 1.标准IO 概念\特点\缓存 
 2.标准IO相关函数:
    fopen/freopen
    fclose
    fgetc/fputc
    fgets/fputs
    fread/fwrite
    rewind

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值