当前位置: 首页 > news >正文

io学习----->标准io

思维导图:

一.io的作用

io是实现对文件的操作,把运行结果存到文件中,读取文件的数据,方便后期查询。

二.io的概念

io是指系统 和外部设备或用户之间的数据交互

I:input 表示数据从外部设备输入到内存中;

O:output表示数据从内存中输出到外部设备的过程。

三.io的分类

io分为文件io和标准io;

标准io:指程序和用户之间的数据交互,标准io=文件io+缓冲区

文件io:指程序和系统之间的数据交互

四.文件io和标准io的区别

标准io:

  1. 满足ANS的标准,当编译程序后,可以在不同的编译环境下执行
  2. 存在缓冲区,加快访问速度
  3. 可移植性强,可以在不同的编译环境下执行
  4. 属于库函数调用,只可以访问普通文件
  5. 标准io操作文件时需要依赖于流指针(FILE*)

文件io

  1. 满足POIX标准,只可以在unix操作系统中使用
  2. 不存在缓冲区,访问速度慢
  3. 不可移植,系统调用,依赖系统
  4. 属于系统函数调用,可以访问特殊文件(连接文件,设备文件,管道文件)
  5. 文件io操作系统时需要依赖文件描述符

五.标准io函数

        1.流和流指针

  • 流:数据一个一个移入或移出缓冲区的过程,称为字节流

  • 流指针FILE*: 本质FILE是一个结构体的别名,当存储./a.out的运行结果,需要创建一个文件,每常见一个文件则会在用户空间申请一片缓冲区。缓冲区存在一些信息(缓冲区的首地址,缓冲区的结束地址等)存在流指针

  • 注意FILE默认已经存在的,程序员直接使用即可

        2.查看流指针

  • 1.查看数据类型 vi -t 类型 ----》vi -t FILE
  • 2.追代码 ctrl    ] (右中括号)
  • 3.返回 ctrl t 

        3.标准io函数

  • 1.fopen-------->文件操作:打开,读取,写入,关闭。

    r

    以读的方式打开文件,流指针指向文件的起始地址,如果文件存在则打开成功,不存在则打开失败

    r+

    以读写的方式打开文件. ,流指针指向文件的起始地址,如果文件存在则打开成功,不存在则打开失败

    w

    以写的方式打开文件,如果文件不存在则创建文件,如果文件存在则清空文件

    w+

    以读写的方式打开文件,如果文件不存在则创建文件,如果文件存在则清空文件

    a

    以追加的方式打开文件(写入到文件的结尾)如果文件不存在则创建文件,如果文件存在则流指针指向文件的结尾

    a+

    以读写(追加)的方式打开文件(写入到文件的结尾)如果文件不存在则创建文件,如果文件存在则流指针指向文件的结尾

  • 2.strerror\perror---------功能:根据错误码,返回一个错误码对应的信息

streeor只返回错误信息,没有详细信息,perror 返回错误信息的同时会给一个提示语句

perror截图:

        3.fgetc\fputc

fputc:输出的函数,对于文件,就是写入的意思

fgetc:输入的函数,对于文件,读取的意思

        4.fclose

功能:关闭文件

        5.fseek\rewind\ftell

fseek:功能:设置指针的偏移量(设置光标的位置)

 #include <stdio.h>

int fseek(FILE *stream, long offset, int whence);

参数:

stream: 流指针,就是fopen的fp

        offset: 指针的偏移量,

如果offset>0 ,指针向后偏移

如果offset<0 指针向前偏移

offset=0 指针不偏移

        whence:

SEEK_SET 把光标设置在起始位置

SEEK_CUR 把光标设置在当前位置

SEEK_END 把光标设置在结尾位置

rewind:把光标设置在起始位置

        void rewind(FILE *stream);

ftell:获取当前指针到起始地址之间的文件大小

        1.把光标设置在文件的结尾 fseek(fp,0,SEEK_END);

        2.获取文件大小 long size=ftell(fp)

        6.fputs\fgets

fputs:功能:从文件流指针中写入字符串

格式: int fputs(const char *s, FILE *stream);

fgets:功能:从文件流指针中读取字符串

格式: char *fgets(char *s, int size, FILE *stream);

size: 只可以获取小于size个字符,最多存储size-1

六、练习

  1. 使用标准IO函数,实现文件的拷贝
     #include <head1.h>
     int main(int argc, const char *argv[])
     {
         FILE *fp=fopen("IO.text","r");
         if(NULL==fp)
         {
             PRINT_ERROR("fopen");
         }
         FILE* fp1=fopen("IO.1text","w");
         //读取文件,然后写入
         while(1 )
         {
             char ch=(fgetc(fp));
             if(EOF==ch){break;}
             fputc(ch,fp1);
         }
         fclose(fp); 
         fclose(fp1);                      
         
         return 0;
     }
    

  2. 使用fgets函数,打印一个文件,类似cat

    #include <head1.h>
      2 int main(int argc, const char *argv[])
      3 {
      4     //打开文件
      5     FILE* fp=fopen("./IO.1text","r");
      6         if(NULL==fp)
      7         {
      8             PRINT_ERROR("fopen");
      9         }
     10         
     11     //读取数据
     12     while(1)
     13 {   
     14     int res=fgetc(fp);
     15     if(EOF==res)
     16     {
     17     //  printf("读取失败");
     18     //  return -1;
     19         break;
     20     }   
     21     printf("%c",res);
     22 }   
     23 /*  int res;
     24     while((res=fgetc(fp)) != EOF)
     25     {
     26         printf("%c",res);
     27     }   
     28 */                                                   
     29     //关闭文件
     30         if(fclose(fp)==EOF)
     31             PRINT_ERROR("fopen");
     32             
     33     return 0;
     34 }   
    

  3. 计算文件的行数

#include <head1.h>
int main(int argc, const char *argv[])
{
    //打开文件
    FILE* fp=fopen("IO.text","r+");
    if(NULL==fp)
    {   
        PRINT_ERROR("fopen error");
    }
    int count=0;
                                      
    //循环读取,遇到回车计算行数
    while(1)
    {   
        char ch =fgetc(fp);
        if(ch==EOF){break;}
        if(ch==10){count++;}
    }
    printf("这个文件有%d行\n",count);
    fclose(fp);
    return 0;
}

 

    相关文章:

  1. 解锁ApplicationContext vs BeanFactory: 谁更具选择性?
  2. Mac 下载安装并卸载多jdk教程
  3. HTTP/1.1 和 HTTP/2 的区别,HTTP/2 有哪些新特性?
  4. Transformer结构和注意力机制
  5. 数组中的逆序对(C++)
  6. 六十天前端强化训练之第八天之JavaScript核心之ES6变量与箭头函数(第8-14天:JavaScript核心)
  7. 【Python运维】 Python与日志管理:构建高效的集中式日志收集与分析系统
  8. android bp构建编译C++代码
  9. arxiv论文信息爬取与论文pdf下载
  10. C语言——结构体、联合体/共用体、枚举类型、typedef关键字
  11. 系统架构设计师—软件工程基础篇—软件开发方法
  12. 笔记本电脑本地部署ollama大模型(显存不足调用CUDA Unified Memory方法)
  13. AI应用开发 4 - Langchain应用开发
  14. JavaWeb后端基础(6)
  15. 【网络编程】之TCP实现客户端远程控制服务器端及断线重连
  16. 软考高级信息系统项目管理师笔记-第4章信息系统管理
  17. 【一些技术成长的思考】
  18. 高频Postman接口测试面试题
  19. pytorch-gpu版本安装(英伟达gpu驱动安装)
  20. VSCode知名主题带毒 安装量900万次
  21. 民间打拐志愿者上官正义遭人身安全威胁,杭州公安:已立案
  22. 江苏省委组织部副部长高颜已任南京市委常委、组织部部长
  23. 特朗普再提“接管”加沙,要将其变为“自由区”
  24. 南京江宁区市监局通报:盒马一批次猕猴桃检出膨大剂超标
  25. 第一集|好饭不怕晚,折腰若如初见
  26. 丹麦外交大臣拉斯穆森将访华