io进程----标准io

embedded/2024/9/20 7:28:12/ 标签: c语言

大纲

IO:input,output
          标准IO   文件IO   文件属性获取    目录操作    库(动态库,静态库)

进程:process(程序执行的过程)
          进程基础,线程(同步,互斥,条件变量),进程间通信(无名管道pipe,有名管道fifo,信号signal,共享内存shared memory,信号灯集semphore set,消息队列message queue)

一丶标准IO

1.概念

        标准io:在C库中定义的一组专门用于输入输出的函数

2.特点

(1).通过缓冲机制减少系统调用提高效率

      例如硬盘1KB文件每次只能1B循环读1024
      补充:系统调用:内核向上提供的一组接口
(2).围绕进行操作,流用FILE*来描述,FILE代表的是结构体,描述所操作文件的信息

vi编辑器:

vscode编辑器:
    跳转到定义:ctrl 左键
    前后跳转:
   ctrl alt -
   ctrl shift -
(3).默认打开了三个流:stdin(标准输入)、stdout(标准输出)、stderr(标准错误)

3.缓存区

(1).全缓存:和文件相关
(2).行缓存:和终端相关
   刷新缓存的条件:
            1)  程序正常退出
            2)  缓存区满刷新
            3)  强制刷新fflush

            4) \n在printf中不仅是换行,也是刷新标准输出缓存区的条件

#include<stdio.h>
#include<stdlib.h>
int main(int argc, char const *argv[])
{printf("hello world\n");//\n不光是换行,还是刷新标准输出缓存区的条件(也就是把缓存区的内容打印到终端上)fflush(NULL);//强制刷新缓存区while(1);return 0;//程序正常退出也可以刷新缓存区
}

(3).不缓存:标准错误 strerr

练习: 计算标准输出缓存区大小 KB
方法一:循环遍历打印
方法二:使用标准输出stdout中的_io_buf_end-_io_buf_base

4.函数接口

4.1打开文件

   #include <stdio.h>
   FILE *fopen(const char *path, const char *mode);
   参数:path:打开文件
             mode:打开方式
             r:只读,流被定位到文件开头
             r+:可读可写,流被定位到文件开头
             w:只写,文件不存在创建,文件存在清空,流被定位到文件开头
             w+:可读可写,文件不存在创建,文件存在清空,流被定位到文件开头
             a:追加,文件不存在创建,存在追加,流被定位到文件末尾
             a
+:可读可写,文件不存在创建,存在追加,开始进行读时从头读,进行写时流被定位到文件末尾,
注:当a+的方式打开文件时,写只能在末尾进行追加,定位操作是无法改变写的位置,但是可以改变读的位置.
            返回值:成功:文件流
                           失败:
NULL,并且设置errno(错误码)

#include<stdio.h>
int main(int argc, char const *argv[])
{FILE*fp;fp=fopen("test.txt","r");if(NULL==fp){perror("fopen err");return -1;}printf("fopen success\n");return 0;
}
补充:

         perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 设备 (stderr) 。参数 s 所指的字符串会先打印出, 后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。 在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你设置的一些信息和现在的errno所对应的错误一起输出。

4.2关闭文件

#include <stdio.h>
int fclose(FILE* stream);
功能:关闭文件
参数:stream:文件流

4.3读写操作

4.3.1 fgetc()fputc()

fgetc

 #include <stdio.h>
int fgetc(FILE *stream);
功能:从文件中读一个字符
参数:stream:文件流
返回值:成功:读到字符失败或读到文件末尾:EOF(-1)

fputc

功能:向文件中写入一个字符, 成功写入后文件指针会自动向后移动一个字节位置。
参数:c:要写的字符stream:文件流
返回值:成功:写的字符的ASCII失败:EOF(-1)

针对文件读写

针对终端读写

4.3.2 feof,ferror
int feof(FILE * stream);
功能:判断文件有没有到结尾,也就是当前所在位置后面还有没有字符。
返回:如果到达文件末尾,返回非零值。如果后面还有字符则返回0。

ferror

练习:用代码实现cat的功能

int main(int argc, char const *argv[])
{if (argc != 2){printf("err: %s <filename>\n", argv[0]); // 提示一下正确的格式: ./a.out <filename>return -1;}// 1.打开文件FILE *fp = fopen(argv[1], "r");if (NULL == fp){perror("fopen err");return -1;}int ch;//打印文件中内容while ((ch = fgetc(fp)) != EOF)printf("%c", ch);fclose(fp);return 0;
}
4.3.3 fgets,fputs

针对终端

fgets
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
功能:从文件中读取一串字符
参数:s:存放读取的字符串的首地址size:读取的大小stream:文件流
返回值:成功:读取的字符串的首地址失败或读到文件末尾:NULL
特性:1.一次调用最多读取一行数据2.实际读到个数为size-1个,末尾自动添加\0
fputs
#include <stdio.h>
int  fputs(const char *s,  FILE *stream);
功能:向文件中写字符串
参数:s:要写的内容stream:文件流
返回值:成功:非负整数失败:EOF
#include<stdio.h>
int main(int argc, char const *argv[])
{char buf[32]="";fgets(buf,32,stdin);//将终端输入的字符存入buf,包括回车和\n,例如hello\n\0printf("buf:%s\n",buf);fgets(buf,32,stdin);//再将终端输入的字符存入buf,比如说输入66,就会将buf的前四个字符覆盖,此时buf为66\n\0o\n\0printf("buf:%s\n",buf);fputs("hello",stdout);//将hello输出到终端上printf("\n");fputs(buf,stdout);//将buf中的内容输出到终端上return 0;
}

针对文件

练习:用函数实现wc -l的功能(计算文件行数)

#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{if (argc != 2){printf("err: %s <filename>\n", argv[0]);return -1;}FILE *fp = fopen("test.txt", "r+");if (NULL == fp){perror("fopen err");return -1;}char buf[32] = "";int len = 0;while (fgets(buf, 32, fp)!=NULL)//当fgets遍历到尾时返回NULL{if (buf[strlen(buf) - 1] == '\n')//当数组中最后一个数等于\n时行数+1len++;}printf("wc-l=%d\n", len);fclose(fp);return 0;
}
4.3.4二进制读写文件
可以读写任意类型的数据,以二进制的方式进行读写

fread

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从文件流读取多个元素
参数:	ptr :用来存放读取元素 (可以用来读取任意类型的数据)size :元素大小  sizeof(数据类型)nmemb :读取对象的个数stream :要读取的文件
返回值:成功:读取对象的个数读到文件尾或失败:0

fwrite

#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:将二进制数据写入文件
参数: ptr :是一个指针,保存要输出数据的空间的地址。size :要写入的字节数 sizeof(数据类型)nmemb : 要进行写入元素的个数strem: 目标文件流指针
返回值:成功:写的元素个数失败 :-1
#include <stdio.h>
int main(int argc, char const *argv[])
{FILE *fp;int arr[3] = {1, 2, 3};int data[3] = {};fp = fopen(argv[1], "r+");if (fp == NULL){perror("fopen err");return -1;}fwrite(arr, sizeof(int), 3, fp);//将arr数组中的三个元素转换为二进制,存放到文件流中//将位置指针定位到文件开头,不然上一步是写操作所以接着读的话会从末尾开始读从而什么都读不到rewind(fp); //定位到文件开头int i =fread(data, 4, 4, fp);//将文件流中的二进制数转换为要存放的数据类型存储到data中printf("%d\n",i);//虽然设置的读出个数为4,但是因为只有3个数,所以正确读出的个数为3printf("%d %d %d\n", arr[0], arr[1], arr[2]);printf("%d %d %d\n", data[0], data[1], data[2]);return 0;
}

4.4 文件定位操作

wind
#include <stdio.h>
void rewind(FILE *stream);
功能:将文件位置指针定位到起始位置
fseek
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
功能:文件的定位操作
参数:stream:文件流offset:偏移量:正数表示向后文件尾部偏移,负数表示向文件开头偏移whence:相对位置:SEEK_SET:相对于文件开头SEEK_CUR:相对于文件当前位置SEEK_END:相对于文件末尾
返回值:成功:0失败:-1

#include <stdio.h>int main(int argc, char const *argv[])
{FILE *fp;fp = fopen(argv[1], "r+");if (fp == NULL){perror("fopen err");return -1;}fseek(fp,5,SEEK_SET);//向后移动五个单位到6char a=fgetc(fp);printf("%c\n",a);rewind(fp);//让光标回到头char b=fgetc(fp);printf("%c\n",b);return 0;
}
ftell
#include <stdio.h>
long ftell(FILE *stream);
功能:获取位置指针当前的文件位置
参数:要检测的文件流
返回值:成功:当前的文件位置,出错:-1
#include <stdio.h>int main(int argc, char const *argv[])
{FILE *fp;fp = fopen(argv[1], "r+");if (fp == NULL){perror("fopen err");return -1;}//计算文件字符个数fseek(fp,0,SEEK_END);//让光标移动到尾int len=ftell(fp);//让len记录广表达当前位置printf("%d\n",len);return 0;
}
补充:

1.rewind(fp)和fseek(fp, 0, SEEK_SET)等价
2.可以通过此函数计算文件中字符个数
3.当打开文件的方式为a或a+时,fseek不起作用

4.5 重定向打开文件

freopen

#include <stdio.h>
FILE * freopen(const char *pathname,  const char *mode,  FILE* fp)
功能:将指定的文件流重定向到打开的文件中
参数:path:文件路径mode:打开文件的方式(同fopen)fp:文件流指针
返回值:成功:返回文件流指针失败:NULL

​​​​​​​


http://www.ppmy.cn/embedded/99684.html

相关文章

记录jenkins的一个错误

因为workspace 的权限多了一个s 导致构建镜像出现了失败 [rootsimetra-ecs-01 .jenkins]# ls -la | grep work -rw-r----- 1 root root 46 Aug 17 11:57 org.jenkinsci.plugins.workflow.flow.FlowExecutionList.xml drwxr-x--- 6 root root 4096 Aug 12 10:06 works…

神经重建在自动驾驶模拟中的应用

验证自动驾驶软件需要数百万公里的测试。这不仅意味着系统开发周期长&#xff0c;而且系统的复杂度也会不断增加&#xff0c;同时&#xff0c;大规模的实车测试也会耗费巨量的资源并且可能会面临未知的安全问题。aiSim这样的虚拟仿真工具可以减轻真实世界测试的负担。 AD和ADA…

K8S集群层面监控

KubeStateMetrics简介 kube-state-metrics 是一个 Kubernetes 组件&#xff0c;它通过查询 Kubernetes 的 API 服务器&#xff0c;收集关于 Kubernetes 中各种资源&#xff08;如节点、pod、服务等&#xff09;的状态信息&#xff0c;并将这些信息转换成 Prometheus 可以使用的…

Android点击和触摸音量小的问题(问题追踪)

有客户反馈:A14触摸声音没有 于是乎,追踪setting打开触摸声音的代码: @Overridepublic boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {if (preference == mVibrateWhenRinging) {Settings.System.putInt(getContentResolver(…

MobaXterm接触session会话保存14个的限制

问题描述 在我们使用MobeXterm的过程中&#xff0c;发现session保存了14个之后&#xff0c;再无法继续保存了&#xff1b; 原因是免费版本的MobeXterm的最大个数被限制了&#xff0c;需要进行破解&#xff1b; MobaXterm-keygen解除session保存限制的python脚本 可以使用上面…

OpenSBI的PMP

概述 在RISC-V体系架构中&#xff0c;PMP是用于保护物理内存访问权限的机制。PMP机制允许为不同的物理内存区域指定访问权限&#xff08;读、写、执行&#xff09;。这种机制使得运行在RISC-V处理器上的软件只能访问被明确授权的物理地址空间&#xff0c;从而提高了系统的安全…

快速解析数据挖掘,最短时间明白什么是数据挖掘------下

信息损失函数 &#xff08;Information Loss Function&#xff09;是衡量在数据转换或处理过程中信息丢失的程度的函数。在数据科学、机器学习和统计学中&#xff0c;信息损失是一个重要的概念&#xff0c;尤其是在数据降维、特征选择、数据压缩和隐私保护等领域。 信息损失函…

docker创建数据库容器并映射存储数据

docker创建数据库容器并映射存储数据 介绍创建Redis容器创建PostgresQL容器创建MySQL容器 介绍 使用Docker创建Redis、PostgresQL、MySQL等数据库容器代码示例。 创建Redis容器 使用Docker创建Redis容器并使用Volume映射存储数据是一个常见的操作。以下是详细的步骤&#xf…

网络协议概述,ip协议,TCP协议,udp协议,二者区别,python中用socket类实现网络通信程序的编写(服务器套接字实现TCP编程,UDP编程)

七层协议 ① ip协议 ②TCP协议 TCP协议面向连接的&#xff0c;可靠的协议&#xff0c;有三次握手来保证可靠性 ③ udp协议 不一定可以保证数据发过去&#xff0c;像发短信一样&#xff0c;对方不一定在线&#xff0c;号码也不一定对 TCP,UDP之间存在一些区别&#xff1a…

docker手动部署django项目Dockerfile编排-后端发布

1、首先创建一个桥接网络 docker network create auto 2、部署redis,提供celery的消息队列服务 docker run --name redis --restartalways -d --network auto -v redis:/data redis:alpine3、部署数据库 注意数据库账号密码 docker run --name mariadb --restartalways -d…

根据状态的不同,显示不同的背景颜色

文章目录 前言HTML模板部分JavaScript部分注意&#xff1a;主要差异影响如何处理示例 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 实现效果&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 根据给定的状态…

基于YOLOv8的暴力行为分类系统

本项目旨在通过计算机视觉技术实现暴力行为的实时监测和分类。利用先进的目标检测算法YOLOv8&#xff0c;结合Streamlit开发的前端界面&#xff0c;该系统能够高效地从图像或视频中识别出暴力行为&#xff0c;并及时报警。系统支持对实时摄像头输入进行分析&#xff0c;以及上传…

微软正式确认将在近期关闭经典Windows控制面板

微软在不断测试并为 Windows 添加新功能的同时&#xff0c;也在不断淘汰一些公司认为不再需要的功能。这些功能会被添加到Windows 过时功能的列表中&#xff0c;最近的一项功能是 Paint 3D&#xff0c;该公司宣布它很快就会被淘汰。 与微软似乎希望尽早取消的"3D 画图&quo…

Python计算机视觉——第二章 局部图像描述子

本章旨在寻找图像间的对应点和对应区域。 2.1 Harris角点检测器 Harris 角点检测算法&#xff08;也称Harris & Stephens 角点检测器&#xff09;是一个极为简单的角点检测算法。该算法的主要思想是&#xff0c;如果像素周围显示存在多于一个方向的边&#xff0c;我们认为…

[数据集][目标检测]电力场景输电线导线散股检测数据集VOC+YOLO格式3890张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3890 标注数量(xml文件个数)&#xff1a;3890 标注数量(txt文件个数)&#xff1a;3890 标注…

如何在本地和远程删除 Git 分支?

如何在本地和远程删除 Git 分支&#xff1f; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主理人 擅长.n…

【C/C++】字符或字符串长度及所占内存大小的求法

参考【C/C】字符或字符串长度及所占内存大小的求法_c求整个string的内存大小-CSDN博客 下代码计算字符串的长度和大小。 char str[] "hello";//如果不初始化字符串&#xff0c;则[]里面必须有具体的值&#xff0c;而且最后一个字符为\0 int l strlen(str); cout …

leetcode977:有序数组的平方

有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 public int[] sortedSquares(int[] nums) {int start 0;int end nums.length-1;int[] arr new int[nums.length];for (in…

设计模式 3 单例模式

设计模式 3 创建型模式&#xff08;5&#xff09;&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式&#xff08;7&#xff09;&#xff1a;适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式&#xff0…

鸿蒙OS高级应用开发例题

44项目需要同时进行应用和元服务的开发&#xff0c;并针对当前项目工程中的代码可以分别构建出应用和元服务的包&#xff0c;如何在DevEco Studio中设置不同的构建配置&#xff0c;达成这个目的 A. 在模块级别buld-pronlejson5定义两个target;将两个target的bundleType分别设置…