fread

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);  

功能

按块从文件读取数据,从文件中读 nmemb  个、每个 size  字节的元素,存入 ptr  指向的内存。

参数

-  ptr :存储读取数据的内存首地址(需提前分配足够空间,如定义数组、用  malloc  申请堆内存 )。
-  size :单个元素的字节数(同  fwrite ,需和写入时的  size  一致,否则数据会错位 )。
-  nmemb :希望读取的元素个数(尝试读  size * nmemb  字节,实际读多少看文件内容 )。
-  stream :文件流指针(通过  fopen  打开,需以可读模式如   "r+"  等打开 )。

返回值

- 成功:返回实际读到的元素个数(等于  nmemb  表示读满;若文件末尾不够  nmemb  个元素,返回实际读到的数量 )。
- 文件末尾:返回  0 (可用来判断是否读完文件 )。

#include<stdio.h>
struct stu
{int id;char name[100];int score;
};
int main(int argc,const char*argv[])
{FILE*fp = fopen("./1.txt","r");if(NULL == fp){printf("fopen error\n");return -1;}struct stu s;struct stu ss[10];size_t cnt = fread(&s,sizeof(struct stu),1,fp);printf("cnt = %ld\n",cnt);printf("%d %s %d\n",s.id,s.name,s.score);cnt = fread(ss,sizeof(struct stu),10,fp);printf("cnt = %ld\n",cnt);for(int i = 0;i < cnt;i++){printf("%d %s %d\n",ss[i].id,ss[i].name,ss[i].score);}fclose(fp);
}

fwrite

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);  

功能

按块向文件写入数据,把 ptr  指向的内存数据,以「 size  字节/元素 、共 nmemb  个元素」的形式写入文件。

参数

-  ptr :要写入数据的内存首地址(常搭配数组、结构体等,传递  &变量  或数组名)。
-  size :单个元素的字节数(如  sizeof(int)  表示 int 类型占 4 字节)。
-  nmemb :要写入的元素个数(需和  size  匹配,总写入字节 =  size * nmemb  )。
-  stream :文件流指针(通过  fopen  打开文件获得,需确保以可写模式如  "wb"  、 "a+"  等打开 )。

返回值

- 成功:返回实际写入的元素个数(正常应等于  nmemb ;若磁盘满、权限不足等,可能小于)。

#include<stdio.h>struct stu
{int id;char name[100];int score;
};
int main(int argc,const char*argv[])
{FILE*fp = fopen("./1.txt","w");if(NULL == fp){printf("fopen error\n");return -1;}struct stu ss[5] = {{1,"zahngsan",99},{2,"lisi",90},{3,"wangwu",98},{4,"maliu",67},{5,"wanger",100}};size_t cnt = fwrite(ss,sizeof(struct stu),5,fp);printf("cnt = %ld\n",cnt);fclose(fp);
}

bmp

#pragma pack(1)//bmp文件相关信息
typedef struct tagBITMAPFILEHEADER {short    bfType;         // 文件类型标志int      bfSize;         // 文件大小,单位为字节short    bfReserved1;    // 保留字节short    bfReserved2;    // 保留字节int      bfOffBits;      // 数据偏移量,即实际图像数据开始的位置
}Bmp_file_head_t;
//bmp图像信息
typedef struct tagBITMAPINFOHEADER {int   biSize;         // BITMAPINFOHEADER的大小,单位为字节int    biWidth;        // 位图的宽度,单位为像素int    biHeight;       // 位图的高度,单位为像素short    biPlanes;       // 目标设备的位平面数,必须为1short    biBitCount;     // 每像素位数(颜色深度)int   biCompression;  // 图像压缩类型int   biSizeImage;    // 图像大小,单位为字节int    biXPelsPerMeter;// 水平分辨率,单位为像素/米int    biYPelsPerMeter;// 垂直分辨率,单位为像素/米int   biClrUsed;      // 实际使用颜色数int   biClrImportant; // 重要颜色数
}Bmp_info_t;
#pragma pack()int get_bmp_head_info(const char *bmpname, Bmp_file_head_t *pheadinfo, Bmp_info_t *pbmpinfo)
{FILE *fp = fopen(bmpname, "r");if (NULL == fp){printf("fopen error\n");return -1;}fread(pheadinfo, sizeof(Bmp_file_head_t), 1, fp);fread(pbmpinfo, sizeof(Bmp_info_t), 1, fp);fclose(fp);return 0;
}int main(int argc, const char *argv[])
{Bmp_file_head_t headinfo;Bmp_info_t bmpinfo;get_bmp_head_info("./3.bmp", &headinfo, &bmpinfo);printf("sizeof(Bmp_file_head_t) = %ld\n", sizeof(Bmp_file_head_t));printf("sizeof(Bmp_info_t) = %ld\n", sizeof(Bmp_info_t));printf("biWidth = %d, biHeight = %d, biBitCount = %d\n", bmpinfo.biWidth, bmpinfo.biHeight, bmpinfo.biBitCount);return 0;
}

 流定位相关接口

fseek

int fseek(FILE *stream, long offset, int whence);

功能

实现文件流的重新定位,用于调整文件内部指针的位置,决定后续读写操作从文件的哪个位置开始。

参数

-  stream :需要进行定位操作的文件流指针,由  fopen  等函数打开文件后获得。
-  offset :偏移量,用于指定相对于  whence  位置移动的字节数,可正(向后移动  )、可负(向前移动  ,但需注意不能越界 )。
-  whence :定位的相对基准位置,有以下宏定义可选:
-  SEEK_SET :以文件开头为基准进行偏移, offset  为相对于文件开头的偏移字节数。
-  SEEK_CUR :以文件当前读写位置为基准进行偏移, offset  是相对于当前位置的偏移量。
-  SEEK_END :以文件末尾为基准进行偏移, offset  常搭配负数,实现从末尾往前定位(如  fseek(stream, -10, SEEK_END)  表示定位到文件末尾向前 10 字节处 )。

返回值

- 成功:返回 当前偏移量。
- 失败:返回 -1 ,常见失败情况如偏移量导致越界(如  SEEK_SET  时  offset  为负数 )、文件流异常等。

rewind(fp) ==>fseek(fp,0,SEEK_SET)

ftell

long ftell(FILE *stream);

功能

获取文件流当前位置到文件开头的偏移量,即返回当前文件指针距离文件起始位置的字节数,可用于判断文件大小、辅助 fseek  定位等场景。

返回值

偏移量:byte

练习

#include<stdio.h>
#include<stdlib.h>
struct stu
{int id;char name[100];int score;
};
int main(int argc,const char*argv[])
{FILE*fp = fopen("./1.txt","w+");if(NULL == fp){printf("fopen error\n");return -1;}struct stu ss[5] = {{1,"zahngsan",99},{2,"lisi",90},{3,"wangwu",98},{4,"maliu",67},{5,"wanger",100}};fwrite(ss,sizeof(struct stu),5,fp);fseek(fp,0,SEEK_END);long len = ftell(fp);rewind(fp);FILE*fp1 = fopen("./2.txt","w");if(NULL == fp1){printf("fopen error\n");return -1;}//空洞文件fseek(fp1,len - 1,SEEK_SET);int ret = fputc('\0',fp1);if(EOF == ret){printf("磁盘空间不足\n");return -1;}fseek(fp1,0,SEEK_SET);char *buff = malloc(len);fread(buff,1,len,fp);fwrite(buff,1,len,fp1);free(buff);fclose(fp);fclose(fp1);
}

strtok

char *strtok(char *str, const char *delim);  

功能

按分隔符截取字符串,从  str  中逐个提取由  delim  分隔的子串。首次调用需传入待分割的完整字符串  str ,后续调用传入  NULL  即可继续分割剩余部分(内部会维护静态指针记录位置 )。

参数

-  str :
- 首次调用:传入待分割的原始字符串(会被函数修改,分割后原字符串会被分隔符替换为  \0  ,用于标记子串结束 )。
- 后续调用:传入  NULL  ,函数会基于内部静态指针,继续分割剩余未处理的部分。
-  delim :
传入分隔符字符串(如  ",-"  表示逗号、减号都可作为分隔符 ),只要遇到  delim  中任意字符,就会停止当前子串截取。

返回值

- 成功:返回当前截取到的子串首地址(如分割  "a,b,c"  ,首次返回  "a"  的地址,后续依次返回  "b" 、 "c"  )。
- 失败/结束:返回  NULL (当没有可分割的子串时触发 )。

练习

实现一个单词查询软件: 用户从终端输入一个单词,查找该单词的意思并打印; 若用户输入".quit",则退出该软件。

#include<stdio.h>
#include <string.h>
int main(int argc,const char*argv[])
{FILE*fp = fopen("./dict.txt","r");if(NULL == fp){printf("fopen error\n");return -1;}rewind(fp);char s[1024];printf("输入单词\n");scanf("%s",s);char buff[1024] = {0};if(0 == strcmp(".quit",s)){return 0;    }char *p = fgets(buff,sizeof(buff),fp);while(p != NULL){char *b = strtok(buff," ");if(0 == strcmp(b,s)){b = strtok(NULL,"\r");printf("%s%s\n",s,b);break;}p = fgets(buff,sizeof(buff),fp);}if(p == NULL){printf("not find\n");return 0;}fclose(fp);}



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

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

相关文章

IP分片(IP Fragmentation)

目录 一、核心概念:MTU与分片的必要性 二、IP分片的关键字段(IPv4头部) 三、分片与重组流程 1. 分片过程(发送端或中间路由器) 2. 重组过程(接收端) 四、IPv4与IPv6分片的差异 五、分片的潜在问题与风险 六、总结 一、传输效率降低,带宽开销增加 二、可靠性降低,数据丢…

高并发内存池 内存释放回收(6)

文章目录前言一、threadcache回收内存二、centralcache回收内存三、pagecache回收内存总结前言 Hello&#xff0c;我们继续乘胜追击   本篇难度较大&#xff0c;大家要好好学一下 一、threadcache回收内存 当某个线程申请的对象不用了&#xff0c;可以将其释放给 thread cac…

2438. 二的幂数组中查询范围内的乘积

2438. 二的幂数组中查询范围内的乘积 初始理解题目 首先&#xff0c;我们需要清楚地理解题目在说什么。题目给出一个正整数 n&#xff0c;要求我们构造一个数组 powers&#xff0c;这个数组满足以下条件&#xff1a; 元素性质​&#xff1a;数组中的每个元素都是 2 的幂。即…

【PyTorch学习笔记 - 01】 Tensors(张量)

最近项目需要优化一下目标检测网络&#xff0c;在这个过程中发现还是得增加对框架底层的掌握才可行。于是准备对pytorch的一些基本概念做一些再理解。参考PyTorch的wiki&#xff0c;对自己的学习过程做个记录。 Tensors 是一种特殊的数据结构&#xff0c;与数组和矩阵非常相似…

【C/C++】(struct test*)0->b 讲解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、什么是结构体成员的偏移量&#xff1f; 二、为什么需要计算偏移量&#xff1f; 三、如何计算偏移量&#xff1f; 四、总结 一、什么是结构体成员的偏移量&#…

使用Pytest进行接口自动化测试(三)

&#xff08;一&#xff09;YAML 之前在项目中&#xff0c;我们也是用过YAML来做配置文件&#xff0c;他用于以人类可读的形式存储信息&#xff0c; 特点: 一种简易的可读语言&#xff0c;用于人和计算机交换数据 通常用来存储配置信息 跟python类似&…

算法训练营day46 647. 回文子串、516.最长回文子序列、动态规划总结篇

今天是动态规划的最后一篇内容了&#xff0c;本篇主要是针对回文字符串这种“与众不同”的递推规律来进行讲解 647. 回文子串 统计并返回这个字符串中 回文子串 的数目 暴力解法 两层for循环&#xff0c;遍历区间起始位置和终止位置&#xff0c;然后还需要一层遍历判断这个区…

Qt界面优化

1.QSS在网页前端开发领域中&#xff0c;CSS 是一个至关重要的部分&#xff0c;描述了一个网页的 “样式”&#xff0c;从而起到对网页美化的作用。所谓样式&#xff0c;包括不限于大小、位置、颜色、背景、间距、字体等等。网页开发作为 GUI 的典型代表&#xff0c;也对于其他客…

week1+2+3

408 计组 1.基本组成2.数据的表示和运算定点数&#xff1a;把数字分为定点整数和定点小数分开存储 浮点数&#xff1a;用科学计数法存储 原码 -全部取反-> 反码 反码 1->补码 补码 -符号位取反->移码带余除法&#xff1a;设x,m∈Z&#xff0c;m>0则存在唯一的整数q…

java8中javafx包缺少报错

今天拉取一个jdk1.8的项目里面有一个代码用到了javafx&#xff0c;这个我记得是jdk中的包&#xff0c;正常不应该报错的。然后发现jdk中还真没有&#xff0c;查了一下是因为版本问题。 Java 8 及之前&#xff1a;Oracle JDK 自带 JavaFX&#xff0c;OpenJDK 通常不包含Java 9 …

day072-代码检查工具-Sonar与maven私服-Nexus

文章目录0. 老男孩思想-选对池塘钓美人鱼1. 代码回滚方案2. SonarQube2.1 代码检查工具2.2 部署sonarqube2.2.1 软件要求2.2.2 安装软件2.2.3 启动sonar2.2.4 部署插件2.3 sonar检查java代码2.3.1 创建sona项目2.3.2 分析java代码2.3.3 Jenkins结合sonar检查代码2.4 sonar检查非…

【前端基础】15、列表元素、表格元素、表单元素(注:极其粗略的记载。)

一、列表元素 1、什么是列表元素2、有序列表&#xff08;ol、li&#xff09; ol有序列表 直接子元素只能是li。 li列表中的每一项。3、无序列表&#xff08;ul、li&#xff09; ol无序列表 直接子元素只能是li。 li列表中的每一项。4、定义列表&#xff08;dl、dt、dd&#xff…

IRFBG30PBF Vishay威世MOSFET场效应管

IRFBG30PBF Vishay威世&#xff1a;超快MOSFET 场效应管一、产品定位IRFBG30PBF 是Vishay威世推出的600V/30A N沟道功率MOSFET&#xff0c;采用第五代TrenchFET技术&#xff0c;专为开关电源、电机驱动、新能源逆变器等高功率场景设计。以85mΩ超低导通电阻和超快反向恢复&…

【07-AGI的讨论】

AI ANI&#xff1a;artificial narrow intelligence; 如 智能音箱&#xff1b;自动驾驶汽车&#xff0c;网络搜索&#xff0c;其他用于专业特定事项的工具&#xff1b; AGI&#xff1a;artificial general intelligence; building AI systems that could do anything a typical…

[激光原理与应用-225]:机械 - 3D图与2D图各自的作用

在机械设计与加工领域&#xff0c;3D图和2D图是两种核心的工程表达方式&#xff0c;它们在产品设计、制造、装配及维护等环节中扮演不同角色&#xff0c;具有互补性。以下是它们各自的作用及具体应用场景的详细解析&#xff1a;一、3D图的作用1. 直观展示产品全貌三维可视化&am…

【从零开始java学习|第一篇】java中的名词概念(JDK、JVM、JRE等等)

目录 一、核心运行环境三要素&#xff08;JVM/JRE/JDK&#xff09; 二、常用开发指令&#xff08;JDK 自带工具&#xff09; 三、一些其他概念 四、总结核心逻辑链 要入门 Java&#xff0c;理解核心概念之间的关系是基础。以下是 Java 中最核心的基础概念、工具及相关名词的…

UVa12345 Dynamic len(set(a[L:R]))

[TOC](UVa12345 Dynamic len(set(a[L:R]))) 题目链接 UVA - 12345 Dynamic len(set(a[L:R])) 题意 有编号从 0 到 n−1 的 n 个数&#xff0c;有两种操作&#xff1a; Q L R 询问编号 L 到编号 R−1 的数中有多少个不同的数字。M X Y 将编号为 X 的数字改为 Y。 你的任务就是…

[Ubuntu] VNC连接Linux云服务器 | 实现GNOME图形化

将桌面环境修改为 GNOME 并通过 VNC 远程访问的步骤 & TightVNC 的安装与配置说明&#xff1a;1. 安装 GNOME 桌面环境 sudo apt update sudo apt install ubuntu-gnome-desktop -y2. 安装 TightVNC 服务器 sudo apt install tightvncserver -y3. 初始化 VNC Server 并设置…

进程、网络通信方法

一、进程间通信(IPC)方法 适用于同一台主机上的进程间数据交换。 管道(Pipe) 匿名管道:单向通信,仅用于父子进程。 命名管道(FIFO):通过文件系统路径访问,支持无亲缘关系进程。 消息队列(Message Queue) 结构化消息(类型+数据),按类型读取,支持异步通信。…

[激光原理与应用-241]:设计 - 266n皮秒深紫外激光器,哪些因素影响激光器紫外光的输出功率?

一、短期稳定性266nm皮秒深紫外激光器紫外光输出功率的稳定性受非线性晶体性能、光学系统设计、热管理效果、重复频率与脉冲能量匹配度、环境干扰控制等因素影响&#xff0c;具体分析如下&#xff1a;1. 非线性晶体性能晶体选择与状态&#xff1a;BBO&#xff08;偏硼酸钡&…