今日学习内容

1. 行输入函数安全实践

(1) fgets vs gets

函数安全特性换行符处理缓冲区保护
fgets指定读取长度(size-1保留\n并添加\0安全(防溢出)
gets无长度限制\n替换为\0危险

 

2. Linux标准文件流

文件流符号设备 
标准输入stdin键盘 
标准输出stdout显示器 
标准错误stderr显示器 

 

3. 块数据操作核心函数

(1) fwrite数据写入

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

 

  • 参数解析
    • ptr:数据源首地址
    • size:单个元素字节数(如sizeof(int)
    • nmemb:写入元素个数
    • stream:目标文件流
  • 返回值:实际写入元素个数(非字节数)

(2) fread数据读取

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

 

  • 返回值语义
    • 成功:实际读取元素个数
    • 文件末尾:0
    • 错误:元素数小于请求值

4. 文件流定位三剑客

函数原型核心功能
fseekint fseek(FILE*, long, int)重定位文件指针
ftelllong ftell(FILE*)获取当前偏移量(字节)
rewindvoid rewind(FILE*)重置指针到文件开头
fseek(fp, 100, SEEK_SET); // 从开头偏移100字节  
fseek(fp, -50, SEEK_CUR); // 从当前位置回退50字节  
fseek(fp, 0, SEEK_END);  // 定位到文件末尾  

 

5. 高级文件操作技巧

//fread#include <stdio.h>struct stu
{int id;char name[32];int score;
};int main(void)
{FILE *fp = fopen("./1.txt", "r");if(NULL == fp){printf("open error\n");return -1;}struct stu s[10];size_t cnt = fread(s, sizeof(struct stu), 5, fp);printf("%ld\n", cnt);for(int i = 0;i < cnt; ++i){printf("%d %s %d\n", s[i].id, s[i].name, s[i].score);}fclose(fp);return 0;
}
//fwrite#include <stdio.h>struct stu
{int id;char name[32];int score;
};int main(int argc, const char *argv[])
{FILE *fp = fopen("./1.txt", "r");if(NULL == fp){printf("open error\n");return -1;}struct stu s[5] = {{1, "a", 12}, {2,"b", 34},{3, "c", 56}, {4,"d", 78},{5, "e", 90},};size_t cnt = fwrite(s, sizeof(struct stu), 5, fp);printf("%ld\n", cnt);fclose(fp);return 0;
}
//文件大小
#include <stdio.h>int main(void)
{FILE *fp = fopen("./1.txt", "r");if(NULL == fp){printf("open error\n");return -1;}fseek(fp, 0, SEEK_END);long offset = ftell(fp);printf("%ld\n", offset);fseek(fp, 0, SEEK_SET);fclose(fp);return 0;}
//copy#include <stdio.h>int main(void)
{  FILE *fpsrc = fopen("./1.txt", "r");FILE *fpdest = fopen("./2.txt", "w");if(NULL == fpsrc || NULL == fpdest){printf("open error\n");return -1;}fseek(fpsrc, 0, SEEK_END);long offset = ftell(fpsrc);fseek(fpsrc, 0, SEEK_SET);fseek(fpdest, offset, SEEK_SET);fputc(0, fpdest);fseek(fpdest, 0, SEEK_SET);char buffer[100] = {0};size_t cnt = fread(buffer, offset, 1, fpsrc);fwrite(buffer, offset, 1, fpdest);fclose(fpdest);fclose(fpsrc);return 0;}
//打印bmp图片的文件信息和图像信息#include <stdio.h>#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;
}
//字典#include <stdio.h>
#include <string.h>
char line[500];
char word[50];
int reserchWord(char *word)
{FILE *fp = fopen("./dict.txt", "r");if(NULL == fp){printf("open error\n");return -1;}int t = 0;while(NULL != fgets(line, sizeof(line), fp)){char *find = strtok(line, " ");if(NULL == find){printf("errror\n");continue;}if(0 == strcmp(find, word)){t = 1;printf("find\n");printf("解释:%s\n", line + strlen(find) + 1);break;}}if(t == 0){printf("not found\n");}fclose(fp);return 0;
}int main(void)
{printf("  字典  \n");printf("输入不超过五十个字符的单词\n");printf("输入.quit中断程序\n");while(1){char s[50] = {0};scanf("%s", s);if(0 == strcmp(s, ".quit")){printf("over\n");break;}reserchWord(s);       }return 0;
}

 

 

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

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

相关文章

Springboot2+vue2+uniapp 小程序端实现搜索联想自动补全功能

目录 一、实现目标 1.1 需求 1.2 实现示例图: 二、实现步骤 2.1 实现方法简述 2.2 简单科普 2.3 实现步骤及代码 一、实现目标 1.1 需求 搜索联想——自动补全 &#xff08;1&#xff09;实现搜索输入框&#xff0c;用户输入时能显示模糊匹配结果 &am…

极简 5 步:Ubuntu+RTX4090 源码编译 vLLM

极简 5 步&#xff1a;UbuntuRTX4090 源码编译 vLLM1. 系统依赖&#xff08;一次性&#xff09;2. 进入源码目录 & 激活环境3. 启用 ccache 自动并行度4. 拉代码 编译&#xff08;2 行搞定&#xff09;5. 更新 flash-attn&#xff08;与 vLLM 配套&#xff09;6. 启动 4 …

生产工具革命:定制开发开源AI智能名片S2B2C商城小程序重构商业生态的范式研究

摘要互联网作为信息工具已深刻改变商业生态&#xff0c;但其本质仍停留在效率优化层面。本文提出&#xff0c;基于定制开发开源AI智能名片与S2B2C商城小程序的深度融合&#xff0c;正在引发生产工具层面的革命性变革。该技术架构通过重构"人-货-场"关系&#xff0c;实…

Transformer前传:Seq2Seq与注意力机制Attention

前言 参考了以下大佬的博客 https://blog.csdn.net/v_july_v/article/details/127411638 https://blog.csdn.net/andy_shenzl/article/details/140146699 https://blog.csdn.net/weixin_42475060/article/details/121101749 https://blog.csdn.net/weixin_43334693/article/det…

企业架构工具篇之ArchiMate的HelloWorld(2)

本文通过ArchiMate做一个员工报销流程设计的小demo,按照步骤都可以做出来,在做这个demo之前先简单认识下Archimate的开发界面: 模型树(Models)窗口:通常位于左上方,以树形结构展示一个或多个 ArchiMate 模型。用户可在此浏览模型的整体结构,快速定位到特定的模型元素,…

Docker 详解(保姆级安装+配置+使用教程)

文章目录一、初识 Docker二、Docker 命令1、安装2、配置镜像加速器检查配置是否生效3、服务相关命令4、镜像相关命令5、容器相关命令三、Docker 容器数据卷1、数据卷概念2、数据卷作用3、配置数据卷4、配置数据卷容器四、Docker 应用部署五、备份与迁移六、Dockerfile七、Docke…

做调度作业提交过程简单介绍一下

✅作业提交与执行流程前文提到在 Linux 的 HPC 或超算环境中&#xff0c;可以只在共享存储上安装一次应用程序&#xff0c;然后所有计算节点通过挂载共享目录来访问和执行这些程序&#xff0c;那么作业提交及执行过程是怎么样的流程呢&#xff1f;结构说明&#xff1a;第一行是…

【Altium designer】解决报错“Access violation at address...“

问题现象如上AD9原理图工程所示报错&#xff0c;当我关闭这个“CMM-WEIER-VA”原理图工程以及其他不相关的原理图工程出现报错&#xff1a;Access violation at address 0832A5EC in module WorkspaceManager.DLL. Read of address 00000061 at 0832A5EC&#xff0c;任务管理器…

小杰python高级(three day)——numpy库

1.numpy数组的操作&#xff08;1&#xff09;数组的连接stack该函数可以实现多个数组的堆叠(连接)&#xff0c;会创建新的轴&#xff0c;用于沿着新的轴连接一系列数组&#xff0c;所有数组必须具有相同的形状。可以增加数组的维度。假设输入的每个数组都是 n 维数组&#xff0…

视频剪辑的工作流程

准备素材 1.准备音频&#xff0c;视频、图片等素材 2.准备Pr创建的序列、彩条、字母、倒计时片头等功能性素材 创建项目 创建项目是诗篇剪辑的第一步&#xff0c;创建一个指定名称与存放位置的项目文件&#xff0c;用来通义管理整个视频项目创建序列 序列决定剪辑的尺寸、帧速率…

下一个排列 的 思路总结

文章目录思路分析&#xff1a; 倒序遍历&#xff1a;题目要求的是下一个排列&#xff0c;那么肯定数字的跳跃不能太大&#xff0c;所以可以比较好确定的是&#xff0c;遍历的顺序是倒序遍历比较方向&#xff1a;对于每一个数字&#xff0c;需要找到右边最大的比它小的数字&…

Spring Cloud-面试题(49)

摘要&#xff1a; 1、通俗易懂&#xff0c;适合小白 2、仅做面试复习用&#xff0c;部分来源网络&#xff0c;博文免费&#xff0c;知识无价&#xff0c;侵权请联系&#xff01; 1. 什么是Spring Cloud框架&#xff1f;子项目哪几大类&#xff1f; Spring Cloud是一套分布式系…

资源查看-iostat命令

文章目录 系统中未安装 iostat 命令 1. 监控CPU与磁盘的基础负载 2. 诊断I/O性能瓶颈 3. 实时监控与动态采样 4. 特定设备或分区的精细化监控 5. 性能测试与基准数据生成 6. 结合其他工具进行综合调优 总结 结果输出速查表 第一部分:CPU统计信息 第二部分:设备/磁盘统计信息(…

STM32 HAL库外设编程学习笔记

STM32 HAL库外设编程 1. 概述 本文档是基于STM32 HAL库的外设编程学习笔记&#xff0c;主要包括以下外设的配置和使用方法&#xff1a; GPIO&#xff1a;通用输入输出接口ADC&#xff1a;模数转换器UART&#xff1a;通用异步收发器TIM&#xff1a;定时器I2C&#xff1a;内部…

DHCP服务配置与管理实战指南

DHCP 服务配置与管理笔记 一、DHCP 核心概念 1. DHCP 定义与功能 DHCP (Dynamic Host Configuration Protocol)&#xff1a;动态主机配置协议核心功能&#xff1a; 自动分配 IP 地址提供子网掩码、网关、DNS 等网络参数管理 IP 地址租约周期 典型应用&#xff1a;ADSL拨号、企业…

WebSocket 在多线程环境下处理 Session并发

WebSocket 在多线程环境下处理 Session并发时&#xff0c;常见问题包括状态冲突&#xff08;如 IllegalStateException&#xff09;、消息乱序、连接超时等。以下是综合各技术方案的解决方案&#xff0c;分为单机多线程和分布式集群两类场景&#xff1a;&#x1f512; 一、单机…

JDBC的连接过程(超详细)

JDBC&#xff08;Java Database Connectivity&#xff09;是 Java 用于访问数据库的标准 API&#xff0c;它允许 Java 程序与各种不同类型的数据库进行交互&#xff0c; 其连接数据库的过程主要包含以下几个步骤&#xff1a;1. 导入 JDBC 驱动依赖在使用 JDBC 连接数据库之前&a…

本地WSL部署接入 whisper + ollama qwen3:14b 总结字幕校对增强版

1. 实现功能 M4-4: 校对增强版 (最终完全体) 本脚本是整个 Module 的最终形态&#xff0c;采用了“代码预处理 LLM校对”的终极方案&#xff1a; 代码预处理: 确定性地在每个语音片段后添加逗号&#xff0c;生成一份“标点草稿”。LLM校对: LLM 的任务被简化为“校对和修正”这…

MySQL数据库简介

1 简介 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB公司开发&#xff0c;属于 Oracle 旗下产品&#xff0c;是当今最流行的关系型数据库管理系统之一&#xff0c;在 WEB应用方面&#xff0c;MySQL是最好的RDBMS (Relational Database Management System&#…

[Oracle] UNPIVOT 列转行

Oracle数据库中的UNPIVOT是一种用于将列转换为行的SQL操作&#xff0c;它允许用户将多个列的数据转换为多行的形式&#xff0c;以便进行更灵活的数据分析和报表生成UNPIVOT主要用于将宽表(多列)转换为长表(多行)&#xff0c;减少表的列数&#xff0c;增加行数语法格式SELECT pi…