03标准IO接口

一、系统与标准IO的区别

相同点:系统IO与标准IO都可以操作linux系统下的文件。  

⭐不同点:
系统IO:打开文件得到的是一个整数,称为文件描述符。
标准IO:打开文件得到的是一个指针,称为文件指针。

系统IO:可以访问linux系统下的一切文件,例如:普通文件,设备文件 ,链接文件 ,管道文件 .....  
标准IO:只能访问Linux系统下的普通文件。 

系统IO: 不带缓存区,数据直接写入文件。  
标准IO: 带缓存区,数据写入缓存区,再写入文件中。 

标准IO可以在任意的操作系统使用他是C语言库函数提供的,系统IO只能在Linux操作系统使用。 

总结:在Linux系统下访问💥《普通文件》💥时,一般采用标准IO接口,因为标准IO接口丰富,且写入的效率较高!  

二、标准IO接口的使用

 man 3 fopen 查看打开函数

1、fopen 打开文件

NAME
       fopen, fdopen, freopen - stream open functions
                                 打开文件函数
SYNOPSIS
       #include <stdio.h>

       FILE *fopen(const char *pathname, const char *mode);
       pathname:需要打开的文件路径名 
           mode:权限      
                "r"   只读 
                "r+"  读写  ✔️
                "w"   只写,清空和如果不存在,则创建文件
                "w+"  读写,清空和如果不存在,则创建文件
                "a"   只写,追加,如果不存在则创建 
                "a+"  读写,追加,如果不存在则创建 
     返回值: 成功   返回文件指针 FILE * 
             失败   NULL
     
例子:以读写方式打开文件 
FILE *fp =  fopen("my.txt","r+");         

权限表格

2、fwrite 写入文件

man 3 fwrite 查看写入接口

注意:write  函数可以写入一切数据类型,char ,short , int ,float  ........

NAME
       fread, fwrite - binary stream input/output
                       二进制  流     输入/输出 
SYNOPSIS
       #include <stdio.h>

  

       size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
           ptr:数据的缓存区  
          size:一个数据的大小,例如:char 大小为1 ,short 大小为2,int 大小为 4  ..... 
         nmemb:需要写入数据的个数 
        stream: 文件指针 FILE *   
       返回值: 成功  写入数据的大小 
               失败   -1
例子:    
1.写入 5 个字符 
char  str[10] = {"hello"};  
fwrite(str,1,5,fp);  //一个 char字符大小为 1 , 字符串中包含 5 个字符。 

2.写入 3 个short 
short  buf[10]={1,2,3};   
fwrite(buf,2,3,fp); //一个 short字符大小为 2 , 数组中包含 3 个short。 

3.写 5 个 int  
int  val[]={1,2,3,4,5}; 
fwrite(buf,4,5,fp); //一个 int字符大小为 4 , 数组中包含 5 个int。

3、fread 读取文件

man 3 fread 查看读取接口

NAME
       fread, fwrite - binary stream input/output

SYNOPSIS
       #include <stdio.h>

       size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
       ptr:数据的缓存区 
      size:一个数据的大小 
     nmemb:读取数据的个数
     stream:文件指针FILE * 
     返回值: 成功 读取数据的大小 
             0    文件读取完毕 
             -1   读取错误 
             
例子:读取一个文件中的字符串 
char  buf[1024]={0};
fread(buf,1,1024, fp);          
             
读取一个 int  ,文件保存的数据格式必须为 int 
int  value=0;  
fread(&value,4,1, fp);        
       
读取多个 int 
int  arry[1024]={0};  
fread(arry,4,1024, fp);       

4、fseek 文件光标

man 3 fseek 查看文件光标函数

NAME
       fgetpos, fseek, fsetpos, ftell, rewind - reposition a stream
                                                 修改文件光标
SYNOPSIS
       #include <stdio.h>

       int fseek(FILE *stream, long offset, int whence);
       stream:文件流指针  
       offset:偏移量 
      whence:参考位置   SEEK_SET 头, SEEK_CUR当前位置, or SEEK_END 末尾 
      返回值:成功  0   失败   -1 
      
//获取当前文件光标的偏移量      
long ftell(FILE *stream);

//把文件光标偏移到文件头    
void rewind(FILE *stream);    等价于👉  fseek(stream, 0, SEEK_SET)      

5、fclose 关闭文件

NAME
       fclose - close a stream

SYNOPSIS
       #include <stdio.h>

       int fclose(FILE *stream);

三、main函数传递参数

#include <stdio.h>
// argc:记录用户输入参数的个数  ,例如:  cp file.txt  msg.txt ,所有当前cp程序的个参数为 3
// argv:记录用户输入的参数值    ,argv指针数组,argv[0]=>cp, argv[1]=>file.txt,argv[2]=>msg.txt

int main(int argc, char *argv[])
{
    printf("参数的个数argc=%d\n", argc);

    printf("第一参数的值:argv[0]=%s\n", argv[0]); 
    printf("第二参数的值:argv[1]=%s\n", argv[1]);
    printf("第三参数的值:argv[2]=%s\n", argv[2]);
}

四、标准IO的缓存区

Linux系统的缓存方式

1.不缓冲类型:系统IO接口都是不缓冲的例如: read/write  
    一旦有数据,立刻将数据冲洗到文件
    
2.全缓冲类型:系统IO接口基本上都是全缓存例如: fread/fwrite .... 
    一旦填满缓冲区,立刻将数据冲洗到文件  ,👉 4096个字节后满
    程序正常退出时,立刻将数据冲洗到文件  ,👉 main函中return 0 
    遇到 fflush() 强制冲洗时,立刻将数据冲洗到文件  ,👉fflush()强制刷新 
    关闭文件时,立刻将数据冲洗到文件     , 👉fclose() 关闭刷新。
    
    改变缓冲区类型时,立刻将数据冲洗到文件 ,👉setvbuf()  设置缓存类型
     int setvbuf(FILE *stream, char *buf, int mode, size_t size);     
     stream:需要设置的文件指针
     buf:缓存地址  
     mode:缓存方式 
      _IONBF unbuffered

      _IOLBF line buffered

      _IOFBF fully buffered
    size:缓存区大小     
    
    
3.行缓冲类型: 👉printf  
    同全缓冲类型
    一旦遇到’\n’时,立刻将数据冲洗到文件 ✔️

😘温馨提示:在调用标准IO接口时记住缓存区即可!

五、标准IO数据流操作

数据流操作就是每次只操作文件中的一个字节的数据!

#include <stdio.h>

int fgetc(FILE *stream);  //从文件stream中获取一个字符的数据并返回

int fputc(int c, FILE *stream);  //把字符 c 输出到 stream 中文件中 

六、标准IO数据行操作

数据行操作就是每次操作文件中的一行数据"\n"!


#include <stdio.h>

char *fgets(char *s, int size, FILE *stream); //从一个文件获取数据,当大小为size 或者 遇到 \n 结束获取
  stream:获取数据的文件 
  s:数据缓存区
 size:数据的大小 
  
int fputs(const char *s, FILE *stream); //不会自动换行,遇到\0则停止输出数据到文件中。
s:数据的缓存区 
stream:输入数据的文件指针 

七、⭐标准IO格式化操作

1、格式化输出

man 3 printf 查看格式化输出

int printf(const char *format, ...);  //把format 格式的数据出到标准输出设备中,stdout 
👉等价于fprintf(stdout, const char *format, ...);

int fprintf(FILE *stream, const char *format, ...); //把format 格式的数据出到stream 文件指针中 

int sprintf(char *str, const char *format, ...); //把format 格式的数据出到 char *str 缓存地址中

应用场景:
字符串拼接
char city[100]={"广东省"};
char Street[100]={"广州市从化区鳌头大道"}; 
char all[200]={0};  
sprintf(all,"%s%s",city,Street);  👉广东省广州市从化区鳌头大道

数据类型转换
int value =10086; 
char buf[1024];  
sprintf(buf,"%d",value); //把int 转换为 char *


int snprintf(char *str, size_t size, const char *format, ...); //snprintf可以指定拼接字符串的大小为 size 

2、格式化输入

man 3 scanf 查看格式化输入

#include <stdio.h>

int scanf(const char *format, ...); //从键盘中获取format格式的数据 
等价于 fscanf(stdin, const char *format, ...); 
     
             
int fscanf(FILE *stream, const char *format, ...); //从 stream 文件中获取 format 格式的数据
       
                                          
int sscanf(const char *str, const char *format, ...);//从  str  缓存区中获取 format 格式的数据 

应用场景:
字符串分割 
char buf[1024]={"你好 世界"}; 
char str[100]; 
char str1[100];  
sscanf(buf,"%s %s",str,str1);  //str -> 你好    , str1 -> 世界   

字符串类型转换 
char  buf[100]={"10086"};  
int   value=0;
sscanf(buf,"%d",&value);  // char * -> int  

至此,希望看完这篇文章的你有所收获,我是Bardb,译音八分贝,道友,下期见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981381.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Axure高保真Element框架元件库

点击下载《Axure高保真Element框架元件库》 原型效果&#xff1a;https://axhub.im/ax9/9da2109b9c68749a/#g1 摘要 本文详细阐述了在 Axure 环境下打造的一套高度还原 Element 框架的组件元件集。通过对 Element 框架组件的深入剖析&#xff0c;结合 Axure 的强大功能&#…

【Linux】进程信号——信号保存和信号捕捉

文章目录 信号保存信号相关的概念信号是如何保存的呢&#xff1f;有关信号保存的系统调用sigprocmask信号的增删查改查看pending表验证接口 信号捕捉用户态与内核态信号捕捉流程 总结 信号保存 信号相关的概念 信号递达&#xff1a;指 操作系统 将一个信号&#xff08;Signal…

【FL0090】基于SSM和微信小程序的球馆预约系统

&#x1f9d1;‍&#x1f4bb;博主介绍&#x1f9d1;‍&#x1f4bb; 全网粉丝10W,CSDN全栈领域优质创作者&#xff0c;博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战&#xff0c;以及程序定制化开发…

因子分析讲解

一、定义 因子分析&#xff08;Factor Analysis&#xff09;是一种常用于多变量统计分析的方法&#xff0c;主要用于数据降维、识别潜在的结构、理解变量间的关系。它通过将一组观察变量&#xff08;通常是高度相关的变量&#xff09;转化为一组较少的、互不相关的因子&#x…

从 JVM 源码(HotSpot)看 synchronized 原理

大家好&#xff0c;我是此林。 不知道大家有没有这样一种感觉&#xff0c;网上对于一些 Java 框架和类的原理实现众说纷纭&#xff0c;看了总是不明白、不透彻。常常会想&#xff1a;真的是这样吗&#xff1f; 今天我们就从 HotSpot 源码级别去看 synchronized 的实现原理。全…

DeepSeek搭配Excel,制作自定义按钮,实现办公自动化!

今天跟大家分享下我们如何将DeepSeek生成的VBA代码&#xff0c;做成按钮&#xff0c;将其永久保存在我们的Excel表格中&#xff0c;下次遇到类似的问题&#xff0c;直接在Excel中点击按钮&#xff0c;就能10秒搞定&#xff0c;操作也非常的简单. 一、代码准备 代码可以直接询问…

Metal学习笔记十一:贴图和材质

在上一章中&#xff0c;您设置了一个简单的 Phong 光照模型。近年来&#xff0c;研究人员在基于物理的渲染 &#xff08;PBR&#xff09; 方面取得了长足的进步。PBR 尝试准确表示真实世界的着色&#xff0c;真实世界中离开表面的光量小于表面接收的光量。在现实世界中&#xf…

zabbix“专家坐诊”第277期问答

在线答疑:乐维社区 问题一 Q&#xff1a;这个怎么解决呢&#xff1f; A&#xff1a;缺少这个依赖。 Q&#xff1a;就一直装不上。 A&#xff1a;装 zabbix-agent2-7.0.0-releasel.el7.x86 64 需要前面提示的那个依赖才可以装。 问题二 Q&#xff1a;大佬&#xff0c;如果agen…

让单链表不再云里雾里

一日不见&#xff0c;如三月兮&#xff01;接下来与我一起创建单链表吧&#xff01; 目录 单链表的结构&#xff1a; 创建单链表&#xff1a; 增加结点&#xff1a; 插入结点&#xff1a; 删除结点&#xff1a; 打印单链表&#xff1a; 单链表查找&#xff1a; 单链表…

图像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image

图像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image 文章目录 图像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image主要创新点模型架构图生成器生成器源码 判别器判别器源码 损失函数需要源码讲解的私信我 S…

指纹细节提取(Matlab实现)

指纹细节提取概述指纹作为人体生物特征识别领域中应用最为广泛的特征之一&#xff0c;具有独特性、稳定性和便利性。指纹细节特征对于指纹识别的准确性和可靠性起着关键作用。指纹细节提取&#xff0c;即从指纹图像中精确地提取出能够表征指纹唯一性的关键特征点&#xff0c;是…

泵吸式激光可燃气体监测仪:快速精准守护燃气管网安全

在城市化进程加速的今天&#xff0c;燃气泄漏、地下管网老化等问题时刻威胁着城市安全。如何实现精准、高效的可燃气体监测&#xff0c;守护“城市生命线”&#xff0c;成为新型基础设施建设的核心课题。泵吸式激光可燃气体监测仪&#xff0c;以创新科技赋能安全监测&#xff0…

HTML label 标签使用

点击 <label> 标签通常会使与之关联的表单控件获得焦点或被激活。 通过正确使用 <label> 标签&#xff0c;可以使表单更加友好和易于使用&#xff0c;同时提高整体的可访问性。 基本用法 <label> 标签通过 for 属性与 id 为 username 的 <input> 元素…

数字万用表的使用教程

福禄克经济型数字万用表前面板按键功能介绍示意图 1. 万用表简单介绍 万用表是一种带有整流器的、可以测量交、直流电流、电压及电阻等多种电学参量的磁电式仪表。分为数字万用表&#xff0c;钳形万用表&#xff0c; &#xff08;1&#xff09;表笔分为红、黑二只。使用时黑色…

Python 爬取唐诗宋词三百首

你可以使用 requests 和 BeautifulSoup 来爬取《唐诗三百首》和《宋词三百首》的数据。以下是一个基本的 Python 爬虫示例&#xff0c;它从 中华诗词网 或类似的网站获取数据并保存为 JSON 文件。 import requests from bs4 import BeautifulSoup import json import time# 爬取…

2025年AI PPT工具精选:让演示文稿更智能、更高效

&#x1f4a1; 做PPT太难&#xff1f;没灵感&#xff1f;排版不好看&#xff1f;别怕&#xff0c;AI已经帮你安排好了&#xff01; 想知道2025年最值得推荐的AI PPT工具是哪款&#xff1f;答案就是——秒出PPT&#xff01;&#x1f680; 不仅能一键生成PPT&#xff0c;还能自…

qt-C++笔记之ubuntu22.04源码安装Qt6.8.2

qt-C笔记之ubuntu22.04源码安装Qt6.8.2 code review! 文章目录 qt-C笔记之ubuntu22.04源码安装Qt6.8.21.作者环境&#xff1a;ubuntu22.04、cmake202.安装3.关联已安装的 Qt6 到 Qt Creator4.附&#xff1a;ubuntu18.0的处理&#xff0c;可尝试&#xff0c;作者没有遇到这个问题…

单例模式(线程案例)

单例模式可以分为两种&#xff1a;1.饿汉模式 2.懒汉模式 一.饿汉模式 //饿汉模式&#x1f447; class MySingleTon{//因为这是一个静态成员变量&#xff0c;在类加载的时候&#xff0c;就创建了private static MySingleTon mySingleTon new MySingleTon();//创建一个静…

基于Matlab的多目标粒子群优化

在复杂系统的设计、决策与优化问题中&#xff0c;常常需要同时兼顾多个相互冲突的目标&#xff0c;多目标粒子群优化&#xff08;MOPSO&#xff09;算法应运而生&#xff0c;作为群体智能优化算法家族中的重要成员&#xff0c;它为解决此类棘手难题提供了高效且富有创新性的解决…

(2025年)工会考试该如何高效备考?有学习方法吗?

工会考试备考文章 工会考试高效备考指南 工会在维护职工权益、促进企业和谐发展中扮演着重要角色&#xff0c;工会考试则是选拔优秀工会工作者的关键途径。面对工会考试涉及的法律法规、组织管理以及维权服务等多方面知识&#xff0c;掌握科学备考方法是成功的关键。 法律法规是…