fwrite、fread、fprintf、fsanf以及流的定位——标准IO——day3

今天主要讲一下这四个函数接口:fwrite、fread、fprintf、fsancf以及流的定位:ftell、rewind、fseek

函数接口

fwrite

fwrite:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:向流中写入nmemb个对象,每个对象size字节大小,在ptr指向的空间中
参数:ptr:存放数据空间的首地址size:每个数据对象的大小nmemb:数据对象的个数stream:文件流指针
返回值:成功返回写入对象的个数失败返回0读到文件末尾返回0 

例子:向file.txt文件中传入学生类型的结构体数据

#include<stdio.h>typedef struct student{		//定义结构体char name[20];char sex;int age;int score;
}stu_x;int main(void)		//主函数
{stu_x a = {"tom",'m',19,70};		//输入数据stu_x b = {"zero",'f',20,100};stu_x c[3] = {{"jack",'m',18,95},{"john",'f',19,80},{"lucky",'m',20,65},};FILE *fp = NULL;fp = fopen("file.txt","w");		//以写的方式打开文件if(NULL == fp){perror("fail to fopen!");return -1;}fwrite(&a,sizeof(stu_x),1,fp);fwrite(&b,sizeof(stu_x),1,fp);fwrite(c,sizeof(stu_x),3,fp);fclose(fp);return 0;
}

结果:
在这里插入图片描述
可以看出来,数据已经写入文件中,但是cat只能显示ASCII码文件,不能显示二进制文件。

fread

fread:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间中
参数:ptr:存放读取内容空间首地址size:读取对象的大小nmemb:读取对象的个数stream:文件流指针 
返回值:成功返回读到对象个数失败返回0读到文件末尾返回0 

我们可以将刚刚写入进去的数据重新读取出来:

#include<stdio.h>typedef struct student		//fread读取数据的话,必须得要有数据的结构体
{char name[20];char sex;int age;int score;
}stu_t;int ShowStuInfo(stu_t tmpstu)		//以这种方式输出
{printf("name  = %s\n",tmpstu.name);printf(" sex  = %c\n",tmpstu.sex);printf(" age  = %d\n",tmpstu.age);printf("score = %d\n",tmpstu.score);
}int main(void)
{FILE *p = NULL;size_t ret;int i = 0;stu_t a;stu_t b[10];p = fopen("file.txt","r");if(NULL == p){perror("fail to fopen");return -1;}fread(&a,sizeof(stu_t),1,p);	//取a的地址ShowStuInfo(a);ret = fread(b,sizeof(stu_t),10,p);	//取数组b的地址,ret可以看到文件中还有几组数据for(i = 0;i < ret;++i){ShowStuInfo(b[i]);}fclose(p);return 0;
}

结果:
在这里插入图片描述
我们可以看到,再进行第二个fread时,我们写入的读取对象的个数是10,但是实际上只有4个,所以最后ret等于4。

fprintf

fprintf int fprintf(FILE *stream, const char *format, ...);
功能:将格式化字符串输出到stream指向的流中

我的个人观点,认为这个实际上跟printf一样,只不过输入时需要加文件流指针,下面举一个例子:

#include<stdio.h>int main(void)
{FILE *p = NULL;int Num1 = 100;int Num2 = 200;p = fopen("file.txt","w");if(NULL == p){perror("fail to fopen");return -1;}fprintf(p,"hello world!\n num1 = %d , num2 = %d\n",Num1,Num2);	//将值输入到文件中fclose(p);return 0;
}

结果为:
在这里插入图片描述

fscanf

fsancf int fscanf(FILE *stream, const char *format, ...);
功能:从流中读取格式化的字符串

我们可以将文件中的数据进行提取出来。

第二部分就是流的定位

ftell

ftelllong ftell(FILE *stream);
功能:获得流的偏移量
在进行第一次打开文件时,流的偏移量是0

rewind

rewindvoid rewind(FILE *stream);
功能:将流的偏移量重新设置到开头

fseek

fseek int fseek(FILE *stream, long offset, int whence);
功能:设置流的偏移量
参数:stream:文件流指针offset:偏移量> 0 向后偏移< 0 向前偏移
whence:SEEK_SET    文件开头SEEK_CUR    文件当前位置SEEK_END    文件末尾

我们可以做一个简单的例子,方便于了解

#include<stdio.h>int main(void)
{FILE *src = NULL;src = fopen("file.txt","w");if(NULL == src){perror("fail to fopen");return -1;}fseek(src,10,SEEK_SET);		//在文件开头位置向右偏移10fputc('a',src);fseek(src,-5,SEEK_CUR);		//在文件当前位置向左偏移5fputc('c',src);fseek(src,0,SEEK_SET);		//回到文件开头位置fputc('b',src);fclose(src);return 0;
}

结果:
在这里插入图片描述
以上就是今天的所以内容,下面进行一个实例,从终端输入一个单词,获得单词的含义。

#include<stdio.h>
#include<string.h>int main(void)
{FILE *src = NULL;src = fopen("dict.txt","r");	char word[256] = {0};char tmpbuff[4096];char *ptmp = NULL;char *pret = NULL;printf("please input one word:");gets(word);if(NULL == src){perror("fail to fopen");return -1;}while(1)		//进行死循环{pret = fgets(tmpbuff,sizeof(tmpbuff),src);		//在源文件中,每一行结尾都有\n,所以我们可以使用fgets获得每一行的首地址,让pret进行记录//tmpbuff是存放字符串空间首地址,读取4096个字节,要保证足够大if(NULL == pret)	//判断是否读到文件末尾{break;}ptmp = tmpbuff;		while(*ptmp != ' ' && *ptmp != '\0')	//截取单词{++ptmp;}*ptmp = '\0';		//将第一个空格的位置换成\0ptmp++;while(*ptmp == ' '){++ptmp;}if(strcmp(word,tmpbuff) == 0)	//进行字符串判断,看是否与输入的字符串相等{printf("word = %s\n",word);	//输出单词printf("ptmp = %s",ptmp);	//输出含义,因为已经截断了,所以ptmp当前的首地址是含义的地址return 0;}}fclose(src);printf("Word does not exist!\n");return 0;
}

结果:
在这里插入图片描述

以上就是今天内容!

共同学习,共同成长!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[word] word小数点对齐怎么设置 #微信#其他#其他

word小数点对齐怎么设置 使用Word编辑文档的时候&#xff0c;如果有小技巧的话&#xff0c;可以解决很多遇到的问题&#xff0c;也让工作更高效的完成&#xff0c;下面给大家分享word小数点对齐怎么设置的小技巧。 1、设置格式 选中内容&#xff0c;点击段落一一制表符&#…

S3 Browser工具得使用

新增账号 如果需要设置签名得版本&#xff0c;选择上图右下角得advanced setting

【算法设计与分析】求根节点到叶节点数字之和

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数…

python多进程共享字典方案

三者对比 先给出demo代码: import time from multiprocessing import Managerfrom UltraDict import UltraDictdef mul():t1 time.time()d Manager().dict()t2 time.time()for i in range(100000):d[i] iprint(f"[multiple] insert value: {time.time() - t2} s&quo…

【深度学习: AutoAugment】使用 AutoAugment 提高深度学习性能

【深度学习&#xff1a; AutoAugment】使用 AutoAugment 提高深度学习性能 结果 深度学习在计算机视觉领域的成功可以部分归因于大量标记训练数据的可用性——随着训练数据的质量、多样性和数量的增加&#xff0c;模型的性能通常会提高。然而&#xff0c;收集足够的高质量数据来…

cesium mapboxgl+threebox glb 朝向问题

一、3Dbuilder打开glb 二、cesium在pitch和heading都为0的情况下&#xff0c;不设置模型的朝向 三、mapboxglthreebox在pitch和bearing都为0的情况下&#xff0c;不设置模型的朝向 四、对于地图默认视角&#xff0c;cesium设置pitch-90、heading0的时候和mapboxglthreebox设置p…

2023年全国职业院校技能大赛软件测试赛题第3套

2023年全国职业院校技能大赛 软件测试赛题第3套 赛项名称&#xff1a; 软件测试 英文名称&#xff1a; Software Testing 赛项编号&#xff1a; GZ034 归属产业&#xff1a; 电子与信息大类 …

【Linux C | I/O模型】IO复用 | poll、ppoll函数详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

BUGKU-WEB 留言板

题目描述 题目无需登录后台&#xff01;需要xss平台接收flag&#xff0c; http协议需要http协议的xss平台打开场景后界面如下&#xff1a; 解题思路 看到此类的题目&#xff0c;应该和存储型xss有关&#xff0c;也就是将恶意代码保存到服务器端即然在服务器端&#xff0c;那就…

(2024,VLM,操纵链)CogCoM:训练大型视觉语言模型,通过操作链深入细节

CogCoM: Train Large Vision-Language Models Diving into Details through Chain of Manipulations 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 方法 2.1. 术语 2.2…

C语言之自定义类型:联合和枚举

目录 1. 联合体类型的声明2. 联合体的特点3. 联合体大小的计算联合的一个练习 4. 枚举类型的声明5. 枚举类型的优点6. 枚举类型的使用 1. 联合体类型的声明 像结构体一样&#xff0c;联合体也是由一个或者多个成员构成&#xff0c;这些成员可以不同的类型 但是编译器只为最大…

一篇文章了解Python中的对象(狠狠爱住)

Python中的对象 在Python中&#xff0c;对象是面向对象编程的核心。几乎Python中的一切都是对象&#xff0c;包括数字、字符串、函数、类等。每个对象都有一个身份、一个类型和一个值。 对象的特性 身份&#xff08;Identity&#xff09;&#xff1a;每个对象都有一个唯一的身…