标准IO及相关练习

news2024/11/16 20:25:05

标准IO

能够将指定的数据写入指定的文件中的操作(通过文件指针去访问指定的文件:FILE*),标注IO只提供写入或者读取操作,不提供删除文件中的内容,想要删除文件,则需要自己写逻辑来实现。

文件指针如何指向文件

fopen函数

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

功能:

让一个文件流指针指向pathname文件,并以mode形式打开该文件,指向文件的文件流指针会以返回值的形式返回。

参数:

pathname:准备被FILE*指针指向的文件的路径名

mode:使用以下提供的几种形式打开

r:文件以只读的形式打开,打开后文件流指针指向文件的开头,文件开头指的是文件的第一个数据的地址,文件结尾指向文件中结束符的地址。(如果文件不存在,则打开失败,FILE*指向NULL)

w:文件以只写的形式打开,如果文件存在,则清空文件内容后打开,如果文件不存在,则创建文件后打开,文件打开后,文件流指针指向文件的开头。(以w形式打开文件,大概率成功,当文件打开数达到上限(1024)时失败,可以用ulimit -a查看)

r+:以读写的形式打开文件,其他和“r”一样(不会清空文件,不会创建文件)。(以读写的形式打开,读光标与写光标独立管理,针对文件的读写操作都会使文件流指针自动向后偏移一位,保持下次读写的使新的数据)

w+:以读写的形式打开文件,其他和“w”一样。(以读写的形式打开,读光标与写光标独立管理,针对文件的读写操作都会使文件流指针自动向后偏移一位,保持下次读写的使新的数据)

a:以追加写的形式打开文件,从文件的末尾开始写,如果文件不存在,则创建文件后打开,如果文件存在则直接打开,文件打开后,文件指针指向文件末尾

a+:以读和追加写的形式打开文件,如果文件不存在,则创建文件后打开,如果文件存在则直接打开(读指针指向文件的开头,写指针总是指向文件的末尾)

fclose函数

功能:

关闭一个文件,只需要传入一个文件流指针,即可关闭该文件

三个特殊的文件流指针

stdin,stdout,stderr:都是FILE*类型的,这三个文件流指针不需要手动打开,每一个程序天生就有

stdin:指向终端输入流(scanf)

stdout:指向终端输出流(printf)

stdout:指向终端的错误流

标准错误流

错误流本质上就是一种输出流,默认的错误流还是输出到终端

存在意义:仅仅为了区分标注输出流,标准输出流输出到终端,标准错误流通过一系列的操作,输出到”错误日志“,将来查看错误信息的时候

标准错误流使用的函数

perror函数

void perror(const char *s);

功能:

使用stderr输出s +“:”+ error对应的错误信息

erron:本质上是一个全局的int变量

大部分函数运行出错时都会修改erron的值

查看代码中的某个宏的值

  1. cd /usr/include
  2. sudo ctags -R //建立一个索引目录
  3. vim -t 想要搜索的代码

读写文件

fputc和fgetc

fputc

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

功能:

将数据输出到文件流指针所指向的文件中(向文件中输入一个字节的数据之后,文件流指针自动向后偏移一个字节,防止覆盖钱一个字节的内容)

fgetc

int fgetc(FILE *stream);

功能:

从指针指向的文件中,读取一个字节的数据,并且将读取到的数据以返回值的形式返回

返回值:成功读取数据,返回读取到的字符(unsigned char形式),读取到文件末尾返回 EOF (-1),我们使用 fgetc 想要读取文件中所有内容的时候,由于不知道文件中有多少数据,所以只能通过读取到文件结束符的方式来判断文件是否读取结束

fgetc读取到文件结束符返回的就是 EOF 也就是 -1

总结:所有想要读取文件中所有数据的代码,

形式如下

while(1)

{

读取文件的函数

判断文件是否读取完毕{break;}

}

练习:

使用fgetc计算一个文件的行数

使用fgetc与fputc实现文件拷贝功能

fprintf和fscanf

fprintf

int printf(const char *format, ...);

把数据输出到终端

int fprintf(FILE *stream, const char *format, ...);

功能:

将format字符串中的内容,输出到stream文件流指针指向的文件中去,想要将数据以何种形式输出到文件中,只需在format中选择合适的占位符即可。

int sprintf(char *str, const char *format, ...);

功能:

将format字符串中的内容,输出到str所指向的字符数组中。(把任意类型的数据转换为字符串类型数据)

fscanf

int scanf(const char *format, ...);

从终端读取数据,把数据写入到format中格式占位符代表的变量的地址上

int fscanf(FILE *stream, const char *format, ...);

功能:

从stream文件流指针的指向的文件中读取匹配数量的数据(根据文件中数据的类型以及格式占位符的类型进行匹配),遇到不匹配的数据则不吸收,然后将吸收到的数据写入format中格式占位符所代表的地址上去。*%c可以吸收任意数据包括空格,回车等

返回值:成功吸收数据返回成功吸收的数据的项数(其实就是指格式占位符的数量)

*fscanf是格式化读取文件的函数,需要精准的把控文件中的数据是什么格式,然后使用对应的格式去读取,除非用%c一个字节一个字节的读取。

int sscanf(const char *str, const char *format, ...);

功能:

从str所指向的字符串或字符串数组中读取数据,写入format所代表的地址上。(将字符串类型转换成任意类型的数据)

练习

typedef struct student
{
  char name[20];
  int c;
  int m;
  int e;
  int p;
  int ch;
  int b;
}stu;
stu str[3]={};
编写两个.c文件:save.c和load.c
save.c负责使用fprintf把三个学生的数据保存到文件中
load.c负责读取文件中的学生信息,将读取到的数据,存到数组中,并输出数组中的内容

练习

有如下结构体:
typedef struct Student{
    char name[20];
    int chinese;//语文成绩
    int math;
    int english;
    int physical;
    int chemical;
    int biological;
}stu_t;

使用一张链表保存5个学生的信息,学生信息自己初始化

编写2个.c文件,save.c 和 load.c
save.c负责:   
    使用fprintf将3个学生的所有信息保存到文件中去
load.c负责:
    使用fscanf读取文件中的3个学生的信息,将读取到的数据,保存到一个 stu_t arr[3]数组里面去,并输出arr数组中的内容
    
最终实现效果:
    运行save.c,会将准备的学生信息写入文件中
    运行load.c,会将文件中的所有学生信息输出到终端上

save.c文件

#include <stdio.h>
#include <string.h>
#include <stdlib.h>	
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>

typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
typedef struct student
{
	char name[20];
	int c;
	int m;
	int e;
	int p;
	int ch;
	int b;
}stu;

typedef stu DataType;
typedef struct node
{
	union
	{
		int len;    //头节点的数据域
		DataType data;     //普通节点的数据域
	};
	struct node *next;   //节点的指针域
}linkList,*linkListPtr;

linkListPtr create()
{
	linkListPtr l=(linkListPtr)malloc(sizeof(linkList));
	if(NULL==l)
	{
		printf("创建失败\n");
		return NULL;
	}
	l->len=0;
	l->next=NULL;
	printf("创建成功\n");
	return l;
}

linkListPtr create_node(DataType a)
{
	linkListPtr p=(linkListPtr)malloc(sizeof(linkList));
	if(NULL==p)
	{
		printf("申请失败\n");
		return NULL;
	}
	p->data=a;
	p->next=NULL;
	return p;
}

void add(linkListPtr l,DataType a)
{
	if(NULL==l)
	{
		printf("插入失败\n");
		return;
	}
	linkListPtr p=create_node(a);
	if(NULL==p)
	{
		return;
	}
	linkListPtr q=l;
	while(q->next)
	{
		q=q->next;
	}
	q->next=p;
	l->len++;
}

int main(int argc, const char *argv[])
{
	linkListPtr l=create();
	stu str[5]={		
		{"牛二",45,65,57,48,98,15},
		{"孙一",45,65,57,48,98,15},
		{"张三",45,65,57,48,98,15},
		{"李四",15,34,48,57,98,48},
		{"王五",54,25,15,67,18,46},
	};
	add(l,str[0]);
	add(l,str[1]);
	add(l,str[2]);
	add(l,str[3]);
	add(l,str[4]);
	
	FILE* fp=fopen("./student","w");
	linkListPtr q=l;
	for(int i=0;i<l->len;i++)
	{
		q=q->next;
		fprintf(fp,"%s %d %d %d %d %d %d\n",q->data.name,q->data.c,q->data.m,q->data.e,q->data.p,q->data.ch,q->data.b);
	}

	fclose(fp);
	return 0;
}

load.c文件

#include <stdio.h>
#include <string.h>
#include <stdlib.h>	
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>

typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
typedef struct student
{
  char name[20];
  int c;
  int m;
  int e;
  int p;
  int ch;
  int b;
}stu;
typedef stu DataType;
typedef struct node
{
	union
	{
		int len;    //头节点的数据域
		DataType data;     //普通节点的数据域
	};
	struct node *next;   //节点的指针域
}linkList,*linkListPtr;

linkListPtr create()
{
	linkListPtr l=(linkListPtr)malloc(sizeof(linkList));
	if(NULL==l)
	{
		printf("创建失败\n");
		return NULL;
	}
	l->len=0;
	l->next=NULL;
	printf("创建成功\n");
	return l;
}

linkListPtr create_node(DataType a)
{
	linkListPtr p=(linkListPtr)malloc(sizeof(linkList));
	if(NULL==p)
	{
		printf("申请失败\n");
		return NULL;
	}
	p->data=a;
	p->next=NULL;
	return p;
}

void add(linkListPtr l,DataType a)
{
	if(NULL==l)
	{
		printf("插入失败\n");
		return;
	}
	linkListPtr p=create_node(a);
	if(NULL==p)
	{
		return;
	}
	linkListPtr q=l;
	while(q->next)
	{
		q=q->next;
	}
	q->next=p;
	l->len++;
}

int main(int argc, const char *argv[])
{
	FILE* fp=fopen("./student","r");

	linkListPtr l=create();
	stu str[128]={0};
	linkListPtr q=l;
	int i=0;
	while(1)
	{
		int v=fscanf(fp,"%s %d %d %d %d %d %d\n",str[i].name,&str[i].c,&str[i].m,&str[i].e,&str[i].p,&str[i].ch,&str[i].b);	
		if(EOF==v)
			break;
		i++;
	}	
	add(l,str[0]);
	add(l,str[1]);
	add(l,str[2]);
	add(l,str[3]);
	add(l,str[4]);	
	for(int i=0;i<l->len;i++)
	{
		q=q->next;
		printf("%s %d %d %d %d %d %d\n",q->data.name,q->data.c,q->data.m,q->data.e,q->data.p,q->data.ch,q->data.b);
	}

	
	return 0;
}

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

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

相关文章

【LeetCode Cookbook(C++ 描述)】一刷哈希表(Hash Table)(下)

目录 LeetCode #349&#xff1a;Intersection of Two Arrays 两个数组的交集LeetCode #383&#xff1a;Ransom Note 赎金信LeetCode #454&#xff1a;4Sum II - 四数相加 II 本系列文章仅是 GitHub 大神 halfrost 的刷题笔记 《LeetCode Cookbook》的提纲以及示例、题集的 C转化…

办公楼子母钟系统,不止显示时间,还可以做临时告示牌

在现代办公环境中&#xff0c;时间管理对于提高工作效率至关重要。传统的时钟往往只能提供最基本的时间显示功能&#xff0c;而在快节奏的办公楼里&#xff0c;一个既能准确显示时间又能发布紧急通知的系统显得尤为必要。本文将介绍办公楼子母钟系统的独特优势及其在不同场景中…

TOOL使用

一、代码生成器 1.页面代码生成&#xff08;前端&#xff09; 生成后会在前端&#xff08;pc&#xff09;代码中看得到代码&#xff0c;可在此做二次开发&#xff1a; 代码生成器中新建不同模块&#xff0c;对应着modules文件夹下文件夹—>生成代码时&#xff0c;选择对应…

50etf期权怎么可以买跌做空吗?

50ETF期权可以做买方也可以做卖方&#xff0c;并且50ETF期权还能够买涨买跌双向交易&#xff0c;50ETF期权可以看涨期权和看跌期权&#xff0c;所以50ETF期权是可以买跌做空的&#xff0c;并且50ETF期权是很适合进行做空操作的&#xff0c;下文为大家介绍50etf期权怎么可以买跌…

如何将.bin文件,hex方式查看里面数据。以自己需要的任何长度来分割

liunux环境编译命令&#xff1a; gcc test.cpp -o testtest.cpp 文件&#xff1a; instring 为需要被分割的文件&#xff1a; outstring 为分割后的文件&#xff1a; #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.…

NSF共享目录未授权访问

NSF共享目录未授权访问 Network File System(NFS)&#xff0c;是由SUN公司研制的UNIX表示层协议(pressentation layer protocol)&#xff0c;能使使用者访问网络上别处的文件就像在使用自己的计算机一样。服务器在启用nfs服务以后&#xff0c;由于fs服务未限制对外访问&#x…

同步时钟系统,防水效果出色,无惧户外雨天环境

在我们的日常生活和工作中&#xff0c;时钟是不可或缺的存在。然而&#xff0c;传统时钟在使用过程中逐渐暴露出一些问题。 传统时钟通常依靠机械结构或简单的电子元件来保持时间的准确性&#xff0c;这使得它们容易受到外界因素的干扰。例如&#xff0c;温度的变化可能导致机芯…

NAS性能巅峰的第二选择 | 极空间Z423标准版开箱体验,强大的不仅仅只是配置

NAS性能巅峰的第二选择 | 极空间Z423标准版开箱体验&#xff0c;强大的不仅仅只是配置 哈喽小伙伴们好&#xff0c;我是Stark-C~ 在去年10月份新品发布会的时候&#xff0c;极空间推出了堪称私有云性能巅峰的『极空间Z423』。作为当前民用级NAS配置的天花板&#xff0c;极空间…

安防视频监控EasyCVR视频汇聚平台设备发送了GPS位置,但是订阅轨迹为空是什么原因?

安防视频监控EasyCVR视频汇聚平台兼容性强、支持灵活拓展&#xff0c;平台可提供视频远程监控、录像、存储与回放、视频转码、视频快照、告警、云台控制、语音对讲、GIS地图、轨迹跟踪、平台级联等视频能力。 用户描述&#xff0c;设备在电子地图中可以查看到定位信息&#xff…

简单操作,轻松创作专业级电子书

在当今数字化时代&#xff0c;电子书的崛起为创作者们带来了前所未有的便利和创作自由。相较于传统印刷书籍&#xff0c;现代电子书的制作过程不再是一项复杂而耗时的任务&#xff0c;而是通过简单操作就能轻松实现的专业级创作。 但是你知道该如何创作专业级的电子书吗&#x…

STM32的FATFS文件系统移植

准备工作 本移植基于STM32HAL库&#xff0c;在开始移植之前准备好一个Cubemx、一个待移植的FATFS源码和一张文件格式为FAT32且大小小于等于32G的SD卡。本项目用的是正点原子的F103开发板。 源码下载&#xff1a;FatFs - Generic FAT Filesystem Module 移植开始 cubemx代码 此…

图片无损压缩工具都有哪些?试试这3款巨好用的压缩软件!支持在线使用

3个图片无损压缩工具推荐&#xff0c;在线免费使用 请你一定要收藏好&#xff01; 1、转转大师 推荐指数&#xff1a;⭐⭐⭐⭐⭐ 直达链接>>pdftoword.55.la 转转大师是一个专业文档转换工具&#xff0c;支持在线编辑&#xff0c;也是微软office官方中国合作伙伴&…

07.FreeRTOS列表与列表项

文章目录 07. FreeRTOS列表与列表项1. 列表和列表项的简介2. 列表相关API函数3. 代码验证 07. FreeRTOS列表与列表项 1. 列表和列表项的简介 列表的定义&#xff1a; typedef struct xLIST {listFIRST_LIST_INTEGRITY_CHECK_VALUE /* 校验值 */volatile UBaseType_t uxN…

吴恩达机器学习-可选的实验室-正则化成本和梯度

目标 在本实验中&#xff0c;你将: 用正则化项扩展前面的线性和逻辑代价函数。重新运行前面添加正则化项的过拟合示例。 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from plt_overfit import overfit_example, output from lab_utils_common i…

关于vs2022项目占用空间太大的问题

之前在分享vs2022项目&#xff08;估计其它vs版本也差不多&#xff09;的时候发现项目占用空间比较大&#xff0c;即使压缩也不利于上传网盘&#xff0c;于是看了一下目录&#xff0c;发现有个隐藏的.vs目录&#xff0c;里面有个和项目同名的文件夹&#xff0c;占用着很大的空间…

⌈ 传知代码 ⌋ MSA+抑郁症模型总结(三)

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

NLP——Transfromer 详解

Transformer总体架构图 输入部分&#xff1a;源文本嵌入层及其位置编码器、目标文本嵌入层及其位置编码器 编码器部分 由N个编码器层堆叠而成 每个编码器层由两个子层连接结构组成 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接 第二个子层连接结构包…

Liunx---批量安装服务器

目录 一、环境准备 一、环境准备 1.准备一台rhel7的主机并且打开主机图形。 2.配置好可用ip 3.做kickstart自动安装脚本后面需要用到DHCP&#xff0c;关闭VMware DHCP功能 二、安装图形化kickstart自动安装脚本的工具 yum install system-config-kickstart ----安装图形化生…

Guitar Pro简谱怎么输入 ?如何把简谱设置到六线谱的下面?

一、Guitar Pro简谱怎么输入 简谱在音乐学习、演奏、创作和传播中都起着非常重要的作用&#xff0c;是音乐领域不可或缺的工具。吉他乐谱的制作可以使简谱&#xff0c;也可以使五线谱、六线谱等多种形式&#xff0c;这几种乐谱都可以使用Guitar Pro来完成。下面来看看Guitar Pr…

springboot大学生社会实践管理信息系统-计算机毕业设计源码61970

目 录 摘要 Abstract 1 绪论 1.1 研究背景与意义 1.2 国内外研究现状 1.3 论文结构与章节安排 2 系统分析 2.1 可行性分析 2.1.1技术可行性 2.1.2 经济可行性 2.1.3 社会可行性 2.2 系统流程分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.…