文件IO/标准IO

news2025/6/8 12:35:30

1.标准I/O

标准: 任何操作系统皆可使用;使用范围很广

系统调用和库函数

系统调用:操作系统给我们提供的接口                     man 2

printf 可以调用内核中的接口  直接驱动显卡运行

printf实际是库函数中的函数,然后调用系统调用

原因:针对不同的操作系统,库函数可以翻译后成标准的系统调用对接不同的系统(安卓/linux)

strlen memcpy 等函数 也是靠库函数实现                 man 3

直接使用系统调用的--->    文件io

  1. 系统调用和库函数

    系统调用就是操作系统提供的接口函数.

如果我们把系统调用封装成库函数就可以起到隔离的作用,提供程序的可移植性。

Printf就是库函数然后调用了系统调用才在显示器上显示字符。

  1. 流的概念   文本流   和   二进制流

就是数据的流,在程序中就是一个结构体。

不同系统,流  不一样

  1. Windows 和linux的换行符区别

   Windows是\r\n

   Linux 是\n

  1. 缓冲区的概念

   为了减少操作IO设备的次数,提高运行效率,在内存里面设置的缓冲区,

   全缓冲:缓冲区满才输出

   行缓冲:遇到换行符输出

2. 文件的打开:

  1. 文件的打开函数

FILE *fopen (const char *path, const char *mode);

Path: 普通文件当前路径不需要加目录,其他要使用完整的路径

Mode:

返回值:出错返回NULL,所以使用fopen函数必须判断是否为空

  1. 文件打开的模式(非常重要)

“r” 或 “rb”

以只读方式打开文件,文件必须存在。

“r+” 或 ”r+b”

以读写方式打开文件,文件必须存在。

“w” 或 “wb”

以只写方式打开文件,若文件存在则文件长度清为0。若文件不存在则创建。

“w+” 或 “w+b”

以读写方式打开文件,其他同”w”。

“a” 或 “ab”

以只写方式打开文件,若文件不存在则创建;向文件写入的数

据被追加到文件末尾。

“a+” 或 “a+b”

以读写方式打开文件。其他同”a”

 文件的打开

#include<stdio.h>

int main(int argc, const char *argv[])
{
	FILE *fp;
	int ret = 0;
	fp = fopen("1.txt","a");
	if (fp == NULL)
	{
		perror("fopen");
		return -1;
	}
	else
	{
		printf("open success\n");
		ret = fclose(fp);
		if (ret == 0)
		{
			printf("fclose success\n");
		}
		else{
			perror("fclose");
		}
	}
	return 0;
}

读写单个字符

字符的输入(读单个字符):

int  fgetc(FILE *stream);

 int  getc(FILE *stream);   //宏

 int  getchar(void);

字符的输出(写单个字符):

int  fputc(int c, FILE *stream);

int  putc(int c, FILE *stream);

int  putchar(int c);

include<stdio.h>

int main(int argc, const char *argv[])
{
	FILE *fp;
	fp = fopen("1.txt","a");
	if(fp == NULL)
	{
    printf("fopen failed\n");
	return -1;
	}
    /*   读函数
	int rec;
	rec = fgetc(fp);
	printf("get char = %c\n",rec);
//文件指针的应用
	rec = fgetc(fp);
	printf("get char = %c\n",rec);

	rec = fgetc(fp);
	printf("get char = %c\n",rec);

	rec = fgetc(fp);
	printf("get char = %c\n",rec);



	fclose(fp);
	*/
     
	int wrc = 'c';
	wrc = fputc(wrc,fp);
	printf("fputc is %c\n",wrc);


	return 0;
}

按行读取字符 fgets

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

成功时返回s,到文件末尾或出错时返回NULL

遇到’\n’或已输入size-1个字符时返回,总是包含’\0’

注意事项:

fgets 函数第二个参数,输入的数据超出size,size-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。

按行输入字符   fputs

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

成功时返回非负整数;出错时返回EOF

puts将缓冲区s中的字符串输出到stdout,并追加’\n’

fputs将缓冲区s中的字符串输出到stream,不追加  ‘\n’

#include<stdio.h>
int main(int argc, const char *argv[])
{
	FILE *fp;
    char *rec;
	char buff[100];
	fp = fopen("1.txt","a+");
	if (fp == NULL){
		perror("fopen");
		return 0;
	}
   rec = fgets(buff,6,fp);
   if (rec== NULL)
   {
	   perror("fgets");
	   return 0;
   }
   while(rec != NULL)
   {
   rec = fgets(buff,6,fp);
   printf("buff = %s\n",buff);
   }
//fputs 的使用,输出字符
   int wrn;
  wrn = fputs("aaaaa",fp);//在1.txt文件追加一行字符串aaaaa
  if(wrn == -1)
{
   perror("fputs");
   return -1;
}

	return 0;
}

二进制读写(二进制读写既可以读写二进制文件,又可以读写文本文件)

文本文件和二进制的区别:

存储的格式不同:文本文件只能存储文本。

所有的文件除了文本文件就是二进制文件:比如说音频文件的读写

计算机内码概念:文本符号在计算机内部的编码(计算机内部只能存储数字0101001....,所以所有符号都要编码)

二进制读写函数格式:

size_t fread(void *ptr, size_t size, size_t n, FILE *fp);

void *ptr  读取内容放的位置指针

  size_t size 读取的块大小

size_t n 读取的个数

  FILE *fp  读取的文件指针

size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);

#include<stdio.h>
#include<string.h>
int main(int argc, const char *argv[])
{
     FILE *fp;
    size_t ret;
	struct student
	{
		char name[16];
		int age;
		char sex[8];
	};
	struct student stu;
	struct student stu2;
	strcpy(stu.name,"zhangsan");
	stu.age = 49;
	strcpy(stu.sex,"male");

    fp = fopen("1.bin","w");
	if(fp == NULL){
		perror("fopen");
		return 0;
	}
   ret = fwrite(&stu,sizeof(stu),1,fp);
   if (ret == -1)
   {
	   perror("fwrite");
	   return 0;
   }
   else{
	   printf("fwrite is success\n");
   }
   fclose(fp);
   //以上为写入二进制内容,下面为读取二进制文件,首先需要刷新文件流指针,这里选择的是先关闭在打开


    fp = fopen("1.bin","r");
	if(fp == NULL){
		perror("fopen");
		return 0;
	}

   ret = fread(&stu2,sizeof(stu),1,fp);
   if (ret == -1)
   {
	   perror("fread");
	   return 0;
   }
   else{
	   printf("fread is success\n");
	   printf("stu2.name = %s, stu2.age = %d, stu2.sex = %s \n",stu2.name,stu2.age,stu2.sex);
   }
   fclose(fp);
	
	return 0;
}

 3.文件I/O

文件IO的概念:

什么是文件IO,又称系统IO,系统调用

是操作系统提供的API接口函数。

POSIX接口 (了解)

注意:文件IO不提供缓冲机制

文件IO的API

open  close read read

文件描述符概念:

英文:缩写fd(file descriptor)

是0-1023的数字,表示文件。

0, 1, 2 的含义 标准输入,标准输出,错误

 3.1文件I/O的读写实现

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, const char *argv[])
{
	int fd;
	int ret;
	char buf[32]={"hello world"};
	char buf2[32] = {0};
	fd =open("test.txt",O_RDWR| O_APPEND;
	printf("fd = %d\n",fd);
	if(fd<0){
		perror("open");
		return 0;
	}
	ret =  write(fd,buf,strlen(buf));
	if (ret < 0 ){
		perror("write");
		return 0;
	}
	printf("buf = %s\n",buf);
//write函数执行结束后,文件流指针处于末尾,所以需要重新打开文件
   
	close(fd);
	
	fd =open("test.txt",O_RDWR);
	printf("fd = %d\n",fd);
	if(fd<0){
		perror("open");
		return 0;
	}

	ret = read(fd,buf2,32);
	if(ret < 0){
		perror("read");
		return 0;
	}
	buf2[31] = '\0';

printf("buf2 = %s\n",buf2);

	return 0;

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

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

相关文章

目标检测笔记

目标检测笔记 one-stage和two-stage目标检测算法Two-Stage 目标检测算法One-Stage 目标检测算法既然Faster R-CNN使得候选区域生成和目标检测可以在同一个网络中端到端训练&#xff0c;为什么它还是属于Two-stage算法&#xff1f; 目标检测模型&#xff0c;训练中的正负样本是什…

分布式技术--------------ELK大规模日志实时收集分析系统

目录 一、ELK日志分析系统 1.1ELK介绍 1.2ELK各组件介绍 1.2.1ElasticSearch 1.2.2Kiabana 1.2.3Logstash 1.2.4可以添加的其它组件 1.2.4.1Filebeat filebeat 结合logstash 带来好处 1.2.4.2缓存/消息队列&#xff08;redis、kafka、RabbitMQ等&#xff09; 1.2.4.…

AI PC元年,华为的一张航海图、一艘渡轮和一张船票

今天&#xff0c;从学术研究者到产业投资者&#xff0c;无不认为大模型掀起了一场人工智能的完美风暴。 所谓“完美风暴”&#xff0c;指的是一项新技术的各个要素&#xff0c;以新的方式互相影响、彼此加强&#xff0c;组合在一起形成了摧枯拉朽般的力量。 而我们每个人&#…

Singleton单例设计模式详解

目录 模式定义应用场景实现方式1.懒汉模式&#xff1a;2.饿汉模式&#xff1a;3.静态内部类反射如何防止反射攻击破坏&#xff1f; 枚举类型序列化 部分源码中的应用定位Spring & JDKTomcat反序列化指定数据源 模式定义 保证一个类只有一个实例&#xff0c;并且提供一个全…

jmeter使用之生成html测试报告

测试的最终结果是需要给出一份报告&#xff0c;那么在用jmeter测试时怎么生成一份报告呢&#xff0c;以下针对jmeter如何生成html报告进行简单介绍 一、首先把测试脚本写好二、利用命令生成html报告 命令&#xff1a;jmeter -n -t 【Jmx脚本位置】-l 【结果文件result.jtl存放…

DBSCAN简介

1. 简介 常用聚类方法有&#xff1a; 1. 层次的方法(hierarchical method)&#xff1b; 2. 划分方法(partitioning method)&#xff1b; 3. 基于密度的方法(density-based method)&#xff1b; 4. 基于网格的方法(grid-based method)&#xff1b; 5. 基于模型的方法(model-base…

[MAUI]集成富文本编辑器Editor.js至.NET MAUI Blazor项目

文章目录 获取资源从源码构建从CDN获取获取扩展插件 创建项目创建控件创建Blazor组件初始化保存销毁编写渲染逻辑 实现只读/编辑功能切换模式获取只读模式状态响应切换事件 实现明/暗主题切换项目地址 Editor.js 是一个基于 Web 的所见即所得富文本编辑器&#xff0c;它由CodeX…

【opencv】示例-npr_demo.cpp 非真实感渲染:边缘保留平滑、细节增强、铅笔素描/彩色铅笔绘图和风格化处理...

Edge Preserve Smoothing- Using Normalized convolution Filter Edge Preserve Smoothing-Using Recursive Filter Detail Enhancement Pencil sketch/Color Pencil Drawing Stylization /* * npr_demo.cpp * * 作者: * Siddharth Kherada <siddharthkherada27[at]gmail[do…

最优算法100例之46-单链表逆置-头插法

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 单链表逆置-头插法 题解报告 1)带头结点 带头结点的反转链表,头结点一直不动,后移head->next。不带头结点的反转,后移…

【vue】defineEmits 传值 子传父

先行知识 【vue】导入组件【vue】defineProps 传数据 父传子 传值流程 App.vue <template><Header getWeb"emitsGetWeb" userAdd"emitsUserAdd"/><hr /><p>web.name: {{ web.name }}</p><p>web.url: {{ web.url }}&…

HarmonyOS实战开发-横竖屏切换

介绍 本实例展示如何使用媒体查询&#xff0c;通过ohos.mediaquery 接口完成在不同设备上显示不同的界面效果。 效果预览 使用说明 1.在竖屏设备上&#xff0c;首页展示新闻列表&#xff0c;点击新闻进入详情界面。 2.在横屏设备上&#xff0c;首页左侧展示新闻列表&#x…

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64)

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64) 一、算法介绍二、算法步骤三、算法实现1.代码 (完整,注释清晰,可直接用)2.结果一、算法介绍 首先说明: ------这里代码手动实现,不调用matlab提供的法向量计算接口,更有助于大家了解法向量和曲率的计算方法,…

【数据结构】复习题(二)

Hello&#xff01;大家好&#xff0c;这一篇数据结构复习题是我上个学期复习的时候写的&#xff08;刚刚在草稿箱发现了&#xff01;&#xff09;有一些题目过程都是配了图片的&#xff0c;希望对正在复习数据结构的宝宝们有帮助哦&#xff01;(还有一个数据结构复习题(一)可以…

从零开始写一个RTSP服务器(一)RTSP协议讲解

目录 前言一、什么是RTSP协议&#xff1f;二、RTSP协议详解2.1 RTSP数据格式2.2 RTSP请求的常用方法2.3 RTSP交互过程2.4 sdp格式 三、RTP协议3.1 RTP包格式3.2 RTP OVER TCP 四、RTCP 前言 为什么要写这个系列&#xff1f; 因为我自己在学习rtsp协议想自己从零写一个rtsp服务…

pytorch车牌识别

目录 使用pytorch库中CNN模型进行图像识别收集数据集定义CNN模型卷积层池化层全连接层 CNN模型代码使用模型 使用pytorch库中CNN模型进行图像识别 收集数据集 可以去找开源的数据集或者自己手做一个 最终整合成 类别分类的图片文件 定义CNN模型 卷积层 功能&#xff1a;提…

R:普通分组柱状图

输入文件实例&#xff08;存为csv格式&#xff09; library(ggplot2) library(ggbreak)# 从CSV文件中读取数据 setwd("C:/Users/fordata/Desktop/研究生/第二个想法(16s肠型&#xff0b;宏基因组功能)/第二篇病毒组/result/otherDB") data <- read.csv("feta…

【软件设计师知识点】一、计算机系统基础知识

文章目录 冯诺依曼计算机CPUCPU 的功能CPU 的组成 数据表示进制转换单位换算定点数浮点小数IEEE 754标准浮点数的运算 校验码奇偶校验码海明码循环冗余校验码&#xff08;CRC&#xff09; 指令系统指令格式寻址方式指令集指令流水线 存储系统存储器的层次化结构存储器的分类相联…

前端vue: 使用ElementUI适配国际化

i18n介绍 i18n&#xff08;其来源是英文单词 internationalization的首末字符i和n&#xff0c;18为中间的字符数&#xff09;是“国际化”的简称。 前端国际化步骤 1、安装i18n插件 安装插件时候&#xff0c;注意必须指定版本号&#xff0c;不然安装会报错。 npm i vue-i1…

【opencv】示例-points_classifier.cpp 使用不同机器学习算法在二维空间中对点集进行分类...

#include "opencv2/core.hpp" // 包含OpenCV核心功能的文件 #include "opencv2/imgproc.hpp" // 包含OpenCV图像处理功能的文件 #include "opencv2/ml.hpp" // 包含OpenCV机器学习模块的文件 #include "opencv2/highgui.hpp" // 包含O…

docker部署Prometheus+AlertManager实现邮件告警

文章目录 一、环境准备1、硬件准备&#xff08;虚拟机&#xff09;2、关闭防火墙&#xff0c;selinux3、所有主机安装docker 二、配置Prometheus1、docker启动Prometheus 三、添加监控节点1、docker启动node-exporter 四、Prometheus配置node-exporter1、修改prometheus.yml配置…