IO相关,标准输入输出及错误提示

news2024/10/10 4:36:47

一、IO简介 

1.1 IO的过程

        操作系统的概念:向下统筹控制硬件,向上为用户提供接口。

        操作系统的组成 = 内核 + 外壳(shell)

        linux的五大功能:进程管理、内存管理、文件管理、设备管理、网络管理。

最早接触的IO:

        printf -- 标准输出 

        scanf -- 标准输入

1.2 IO的种类 

文件IO(系统调用)和 标准IO(库函数)

1.3 文件IO(系统调用)

系统调用是内核提供的受控入口,我们通过系统调用从用户空间进入内核空间。

系统调用特点:可移植性差、实时性强、效率低。

windows:readfile读取文件

linux:read读取文件

1.4 标准IO(库函数)

库函数 = 系统调用 + 缓冲区

库函数的特点:可移植性强,效率高,实时性差。

(缓冲机制的加入,减少了系统调用的次数,提高程序运行效率。)

1.5 常用的接口

文件IO:open、close、read、write……

标准IO:fopen、fclose、fread、fwrite、fseek……

二、标准IO(库函数)

2.1 FILE指针

     FILE是标准库中定义的一个结构体。

     FILE指针是一个结构体指针。   

     FILE指针指向的结构体中包含了打开文件的相关信息,我们通过FILE指针操作文件。

     使用fopen函数成功打开一个文件之后,就会获取一个FILE指针。后面对该文件读写操作,都是通过这个指针。

     每个正在运行的程序都会维护自己的FILE指针,即使多个程序打开了同一个文件,对应的FILE指针也会不同!

每个正在运行的程序都有三个默认打开的FILE指针:

  1. 标准输入:stdin
  2. 标准输出:stdout
  3. 标准出错:stderr -- perror
struct _IO_FILE
{
    char *_IO_buf_bash; /*缓冲区的起始地址*/
    char *_IO_buf_end; /*缓冲区的结束地址*/
    int _fileno; /*文件描述符*/
};

2.2 fopen (打开文件)

#include <stdio.h> ---- 所需头文件
FILE *fopen(const char *pathname,const char *mode);
功能:打开pathname对应的文件
参数:
    pathname:要打开的文件路径和名字
    mode:
        r:以只读的方式打开文件,将光标定位到文件的开头。
        r+:以读写的方式打开文件,光标定位到文件的开头。
        w:以只写的方式打开文件,如果文件存在就清空,文件不存在就创建文件。
        w+:以读写的方式打开文件,如果文件存在就清空,文件不存在就创建文件。
        a:以追加的方式打开文件,光标定位在文件结尾,文件不存在就创建文件。
        a+:以追加和读的方式打开文件,如果读 光标在文件的开头,如果写 光标在文件结尾。
            文件不存在就创建文件
返回值:成功返回FILE指针,失败返回NULL,置位错误码

fopen使用示例

#include <stdio.h>

int main(int argc, const char *argv[])
{
	FILE *fp = NULL;
	//1.以只读的方式打开一个文件
	fp = fopen("./a.c","r");
	if(NULL == fp){
    	printf("fopen error\n");
		return -1;
	}

	return 0;
}

运行结果:

#include <stdio.h>

int main(int argc, const char *argv[])
{
	FILE *fp = NULL;
	
	//2.以只写的方式打开文件:
	  //文件不存在就创建,文件存在就清空
	fp = fopen("./b.c","w");
	if(NULL == fp){
		printf("fopen error\n");
		return -1;
	}

	return 0;
}

运行结果:

2.3 fclose(关闭文件)

#include <stdio.h> -- 所需头文件
int fclose(FILE *stream);
功能:关闭文件
参数:
    stream:FILE指针
返回值:成功返回0,失败返回EOF(-1),置位错误码

fclose使用示例

#include <stdio.h>

int main(int argc, const char *argv[])
{
	//1.先正常输出
	printf("111\n");

	//2.关闭标准输出
	fclose(stdout);

	//3.再次输出
	printf("222\n");

	return 0;
}

运行结果:

#include <stdio.h>

int main(int argc, const char *argv[])
{
	int a = 0;
	//1.先正常输入
	scanf("%d",&a);
	printf("a = %d\n",a);

	//2.关掉标准输入
	fclose(stdin);

	//3.再输入一次
	scanf("%d",&a);
	printf("a = %d\n",a);

	return 0;
}

运行结果:

2.4 错误码

2.4.1 错误码的概念

        错误码就是系统调用失败后,内核向用户返回的错误信息的编号。

        错误码是大于0的整数

        在内核中有4K个错误码。

2.4.2 错误的原理

2.4.3 错误码的使用示例

#include <stdio.h>
#include <errno.h>//errno全局变量在这个头文件中

int main(int argc, const char *argv[])
{
	FILE *fp = NULL;
	//使用fopen打开一个不存在的文件
	fp = fopen("./c.txt","r");
	if(NULL == fp){
		printf("fopen error\n");
		printf("errno = [%d]\n",errno);
		return -1;
	}
	//使用fopen打开一个没有权限的文件
	fp = fopen("./c.txt","r");
	if(NULL == fp){
		printf("fopen error\n");
		printf("errno = [%d]\n",errno);
		return -1;
	}
	return 0;
}

运行结果:

2.4.4 strerror (将错误码转换为错误信息)

#include <string.h> -- 所需头文件
char *strerror(int errnum);
功能:将错误码转换为错误信息(字符串)
参数:
    errnum:错误码
返回值:成功返回错误码对应的错误信息,失败返回“Unknown error nnn”

strerror 使用示例

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc, const char *argv[])
{
	FILE *fp = NULL;
	//打开一个不存在的文件
	fp = fopen("c.txt","r");
	if(NULL == fp){
		printf("fopen error\n");
		printf("errno = [%s]\n",strerror(errno));
		return -1;
	}
	return 0;
}

运行结果:

2.4.5 perror直接打印错误信息

#include <stdio.h>
void perror(const char *s);
功能:直接打印错误信息
参数:
    错误信息提示,这个字符串后面会自动添加“:” 和 换行

perror使用示例

#include <stdio.h>
#include <errno.h>
#include <string.h>


int main(int argc, const char *argv[])
{
	FILE *fp = NULL;
	//使用fopen打开一个不存在的文件
	fp = fopen("./c.txt","r");
	if(NULL == fp){
		perror("fopen c.txt error");
		return -1;
	}
	return 0;
}

运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01背包,CF 1974E - Money Buys Happiness

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1974E - Money Buys Happiness 二、解题报告 1、思路分析 问我们能够到达…

docker简述

1.安装dockers&#xff0c;配置docker软件仓库 安装&#xff0c;可能需要开代理&#xff0c;这里我提前使用了下好的包安装 启动docker systemctl enable --now docker查看是否安装成功 2.简单命令 拉取镜像&#xff0c;也可以提前下载使用以下命令上传 docker load -i imag…

深度学习笔记(持续更新)

注&#xff1a;本文所有深度学习内容都是基于PyTorch&#xff0c;PyTorch作为一个开源的深度学习框架&#xff0c;具有可以动态计算图、拥有简洁易用的API、支持GPU加速等特点&#xff0c;在计算机视觉、自然语言处理、强化学习等方面有广泛应用。 使用matplotlib绘图&#xff…

Linux 常用命令详解,线上问题排查必备

comm 比较文件行 comm 是 Linux 系统下的用于比较两个已排序文件的命令行工具。主要用于找出文件之间的差异或相同之处&#xff0c;例如两个文件中相同的行、仅在第一个文件中的行以及仅在第二个文件中的行。 基本语法 comm [OPTION] FILE1 FILE2可选参数OPTION如下&#xf…

图像分类-demo(Lenet),tensorflow和Alexnet

目录 demo(Lenet) 代码实现基本步骤&#xff1a; TensorFlow 一、核心概念 二、主要特点 三、简单实现 参数: 模型编译 模型训练 模型评估 Alexnet model.py train.py predict.py demo(Lenet) PyTorch提供了一个名为“torchvision”的附加库&#xff0c;其中包含…

芯课堂 | FatFs文件系统的移植及应用指南

1、FatFs文件系统简介 FatFs是用于小型嵌入式系统的通用FAT/exFAT文件系统模块。FatFs模块是按照ANSI C&#xff08;C89&#xff09;编写的&#xff0c;与磁盘控制层完全分离。因此&#xff0c;它独立于平台和存储设备&#xff0c;具有良好的硬件平台独立性。它可以集成到资源有…

这个问题做项目的时给某些客户普及过,这里再给你普及一下

有些因素不是地理概念&#xff0c;没错&#xff01;但与地理有关&#xff01;可以通过地理位置将他们链接起来&#xff0c;再结合其它业务数据&#xff0c;完成数据分析&#xff01;例如百度地图会将&#xff1a;餐饮、文化、交通、住宿、甚至价格、天气与位置关联分析&#xf…

S7---基本介绍

目录 高通S7和S7 Pro Gen 1声音平台 音频性能的新层次 高通XPAN技术 卓越的听力增强 高通第四代ANC 特征 QualcommS7 Pro Gen 1附加功能 QualcommS7 Pro Gen 1框图 高通S7和S7 Pro Gen 1声音平台 声音被重新想象。QualcommS7声音平台旨在开启一个新的高级音频性能级别。…

Unity转Unreal5之从入门到精通 Spline(样条曲线)组件的使用

前言 Spline 组件 能编辑 样条曲线,定义一条路径,路径上的点可以通过距离起点的长度获取,因此可以实现 物体沿路径连续移动 的效果或者 物体沿路径分布 的效果。 今天我们就来实现一个简单的Spline样条曲线的Demo 实现一个沿路径运动的功能 1.新建一个基于 Actor 的蓝图…

JavaSE——集合1:Collection接口(Iterator和增强for遍历集合)

目录 一、集合框架体系(重要) 二、集合引入 (一)集合的理解与好处 三、Collection接口 (一)Collection接口实现类的特点 (二)Collection接口常用方法 (三)Collection接口遍历元素的方式(Iterator和增强for) 1.使用Iterator(迭代器) 1.1Iterator(迭代器)介绍 1.2Itera…

使用cv::FileStorage对yaml文件进行读写

问题描述&#xff1a;记录使用cv::FileStorage对yaml文件进行读写 参考官网&#xff1a;OpenCV: cv::FileStorage Class Reference WRITE&#xff1a;根据文件路径写文件&#xff0c;如果文件不存在会新建&#xff0c;文件存在则变空白 FileStorage fs(filepath, FileStorag…

新增数据集 SDK、“关系抽取”文本标注、优化模型监控和管理|ModelWhale 版本更新

ModelWhale 带来了新一轮的版本更新&#xff0c;期待为大家带来更优质的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; 数据管理&#xff1a;新增 mw_python_sdk 支持通过查看、下载、制作、更新数据集 文本标注&#xff1a;新增“关系抽取…

【DFDT】DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformer

文章目录 DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformerkey points贡献方法补丁提取和嵌入基于注意力的补丁选择多流transformer块多尺度分类器实验DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformer 会议/期刊:App…

Apache Linkis + OceanBase:如何提升数据分析效率

计算中间件 Apache Linkis 构建了一个计算中间件层&#xff0c;以实现上层应用程序和底层数据引擎之间的连接、治理和编排。目前&#xff0c;已经支持通过数据源的功能&#xff0c;实现用户通过Linkis 对接并使用 OceanBase数据库。 本文详细阐述了在 Apache Linkis v1.3.2中&a…

【虚拟化】内核级虚拟化技术KVM介绍,全/半虚拟化的区别,使用libvirt搭建虚拟化平台(go/java/c++)

【虚拟化】内核级虚拟化技术KVM介绍&#xff0c;全/半虚拟化的区别&#xff0c;使用libvirt搭建虚拟化平台&#xff08;go/java/c&#xff09; 文章目录 1、虚拟化技术分类与架构&#xff08;KVM&#xff0c;Xen&#xff09;&#xff0c;全/半虚拟化的区别2、libvirt介绍3、使用…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第二十四章 安装 Samba

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

举个栗子!Tableau 技巧(283):用山丘图呈现项目周期

人们常常用爬山来比喻工作中做项目的过程&#xff1a;明确目标、规划路线、团队合作、应对挑战&#xff0c;然后享受登顶并在下山后总结经验教训。 图片来自网络 在 Tableau 中做项目分析时&#xff0c;将一段时期的项目用山丘图来呈现&#xff0c;山丘大小代表项目周期的时间…

RAG(Retrieval-Augmented Generation,检索增强生成)

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一种结合信息检索与生成式模型的混合架构&#xff0c;旨在提升自然语言生成任务的准确性、丰富性和知识覆盖范围。它通过在生成过程…

sqli-labs less-20 less-21 less-22 cookie注入

COOKIE 作用&#xff1a;是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件&#xff0c;它和你的网络行为有关&#xff0c;记录了当前用户的状态 形式&#xff1a;keyvalue 例如&#xff1a;当我们登录某个账号后&#xff0c;服务器会在cookies进行记录 个人理解&#xf…

基于Vue3+pinia+vue-router+axios+element-plus等开发的新闻发布管理系统

新闻发布管理系统是一个基于Vue3piniavue-routeraxioselement-plus等开发的系统&#xff0c;主要功能包括&#xff1a;登录模块、注册模块、新闻分类管理模块、新闻管理模块、个人中心模块&#xff08;包括基本资料、更换头像、重置密码功能&#xff09;等。 代码下载&#xf…