C| 文件存取

前言:原有的项目存取数据都是写入二进制文件,我改写项目也沿用了之前的方法,但是最近在文件存取方面遇到了问题。问题主要是大数据文件存取存在丢失,所以特地来细看以下用到的文件存取函数,看看是不是有越界的地方。

数据文件

这里的文件存取主要指的是数据文件,分为ASCII文件和二进制文件。其中,ASCII文件又称文本(txt)文件。

文件类型指针

文件类型指针:无论是存还是读文件都是需要用到文件类型指针的,该FILE结构体类型包含在头文件“stdio.h”中。

FILE *fp;

fp指向某一个文件的文件信息区,里面包含文件各种信息,通过其能够访问文件。

打开和关闭文件

无论是存还是读文件都是需要先打开文件,才能进行相应的操作。
而文件打开后都需要进行关闭操作,来释放该文件的所有内存。

打开文件:

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

filename表示文件的路径。

mode表示打开后对文件操作的模式,比较常用的有:

  • 读文件:“ r ”只读文件。
  • 写文件:“ w ”只写文件,没有就会创建个新的。

如果是二进制文件就写成“ rb ”和“ wb ”。

关闭文件:

int fclose( FILE *fp );

写入文件

对于ASCII文件写入有三种:

int fputc( int c, FILE *fp );// 单个字符c写入
int fputs( const char *s, FILE *fp );// 字符串s写入
int fprintf(FILE *fp,const char *s) // 字符串s写入

示例:

#include <stdio.h>
 
int main()
{
   FILE *fp = NULL;
   fp = fopen("test.txt", "w");
   fputc('c', FILE *fp );
   fputs("Testing for fputs...\n", fp);
   fprintf(fp, "Testing for fprintf...\n");
   fclose(fp);
}

如果是二进制文件写入:

size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

ptr是要传入数据的指针,size_of_elements是ptr数据的类型的字节数(用sizeof计算),number_of_elements数据长度。
总共要传入的字节数是size_of_elements×number_of_elements。

示例:

unsigned short* Org;
fwrite(Org, sizeof(unsigned short), size, fp);

读取文件

对于ASCII文件读取有三种:fgetc、fscanf和fgets。

fgetc每次的读取一个字符:

#include <stdio.h>
 
int main()
{
   FILE *fp = NULL;
   int c;
   fp = fopen("test.txt", "r");
   while (c != EOF)
   {
      c = fgetc (fp); // 获取一个字符
      printf("%c", c );
   }
   fclose(fp);
}

fscanf和fgets读取字符串:

#include <stdio.h>
 
int main()
{
   FILE *fp = NULL;
   char buff[255];
   // 文件中的内容:This is a test...
   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);// 遇到一个换行符 '\n' 或文件的末尾 EOF,就会返回读取到的字符
   printf("1: %s\n", buff );// This
   // fgets会在上一次读到的地方继续读
   fgets(buff, 255, (FILE*)fp);// 读取255个字符,最后追null作为终止符
   printf("2: %s\n", buff );// is a test...
   
   fclose(fp);
}

如果是二进制文件读取:

size_t fwrite(const void *ptr, size_t size_of_elements,  size_t number_of_elements, FILE *a_file);

把文件内容读取到ptr指向的内容中,其它参数和写入是一样的。size_of_elements是ptr数据的类型的字节数(用sizeof计算),number_of_elements数据长度。
总共要传入的字节数是size_of_elements×number_of_elements。

文件偏移

fseek函数可以把文件指针移动到想要的文件位置。

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

whence参数:

  • SEEK_SET:文件的开头。
  • SEEK_CUR:文件指针的当前位置。
  • SEEK_END:文件的末尾。

但是注意offset限定位long int类型,大量数据定位的时候,一次定位可能会超越long int范围,导致数据丢失。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NVIDIA_SMI has failed because it couldn’t communicate with the NVIDIA driver

参考&#xff1a;https://www.zhihu.com/question/474222642/answer/3127013936 https://blog.csdn.net/ZhouDevin/article/details/128265656 nvidia-smi查看报错&#xff0c;nvcc正常 1&#xff09;查看nvidia版本 ls /usr/src | grep nvidia nvidia-550.78 2&#xff09;…

无线通信基础

这里写目录标题 通信概述什么是无线通信无线通信电磁波 通信概述 什么是无线通信 无线通信 : 是指利用电磁波信号可以在自由空间中传播的特性进行信息交换的一种通信方式 无线通信的关键技术包括调制技术、解调技术、信道编码技术、信号处理技术、天线技术等。这些技术的不断…

【mobx-入门与思考】

介绍 mobx 是 nodejs生态中的框架&#xff0c; 主要用于做状态管理&#xff0c;可以监控变量状态的变化。 nodejs中除了mobx&#xff0c;还有个redux&#xff0c;也是做状态管理的&#xff0c;都是比较成熟的框架&#xff0c;二者的选择可以参考 【nodejs状态管理: Redux VS M…

太原理工大学Python数据分析原理与应用(课外考题:8~11章)

这部分大概只考10分&#xff0c;且大部分出在选择题&#xff0c;填空最多一两个 (仅供参考) 第十章 (理解概念为主&#xff0c;无需看推导过程) 第十一章

1-1ARM开发环境搭建(GD32)

1:安装MDK最好是5.27以及以上版本&#xff0c;避免后续学习中出现相关错误 2&#xff1a;安装芯片支持包 双击安装即可&#xff0c;也可以是默认路径&#xff0c;也可以自己更改路径 3&#xff1a;安装jlink下载器驱动&#xff08;下载调试器&#xff09; 具体安装步骤如下所示…

Java 线程池 ( Thread Pool )的简单介绍

想象一下&#xff0c;你正指挥着一支超级英雄团队&#xff0c;面对蜂拥而至的敌人&#xff08;任务&#xff09;&#xff0c;不是每次都召唤新英雄&#xff08;创建线程&#xff09;&#xff0c;而是精心调配现有成员&#xff0c;高效应对。这就是Java线程池的魔力&#xff0c;…

重装win11系统后找不到WiFi

由于电脑崩溃重装了系统&#xff0c;win11,装完之后WiFi图标不见了且网络适配器根本没有无线网络选项。 右键电脑》管理》网络适配器。 在刚装好系统时候并没有前两项&#xff0c;查了很多资料&#xff0c;比如 关机14s 重启&#xff0c;还有通过服务配置 WLAN AutoConfig 都…

从0到1提审苹果商店(appstore)上线一款新APP

本篇主要复盘和介绍一款APP如何从0到1上线到苹果商店,将我自己项目遇到的坑跟大家分享,希望能为同样做开发或者运营的你提供经验,少走弯路。 如果你是24年1月1日之后开始首次提审APP,还需要先将自己的APP在工信部备案,苹果后台增加了工信部备案号的填写,备案方法和经验如…

如何去官网下载windows10操作系统iso镜像

文章目录 一、先从微软中国官网https://www.microsoft.com/zh-cn/进去二、然后按图示一步步点进去三、点击下载工具这个工具会帮你生成windows操作系统iso文件四、下载好后一步步按图示要求成功操作一、先从微软中国官网https://www.microsoft.com/zh-cn/进去 二、然后按图示一…

JAVA面向对象高级部分

内部类 内部类的四种形式 内部类概述、成员内部类 代码示例 创建对象的格式 通过对象名访问内部类方法 若内外部类的成员变量名冲突&#xff0c;如何在内部类分别访问外部成员变量。 总结 静态内部类 代码示例 访问静态内部类的方法 不能在静态内部类中访问实例成员变量 …

视频素材库在哪里找免费手机版?8个可以用手机浏览的素材网

在视觉内容占据主导地位的今天&#xff0c;合适的视频素材可以大大提升项目的吸引力和效果。以下列出的视频素材网站为广告制作者、社交媒体策略师及电影制作人提供了从传统到现代风格的各种视频素材选择&#xff0c;满足不同的创作需求。 1. 蛙学府&#xff08;中国&#xff…

展开说说:Android线程池解析

何谓线程池&#xff1f;本人理解是存放和管理线程的一个容器。 线程池存在的意义是什么&#xff1f; 第一&#xff1a;前面博客提到过创建和销毁线程的操作本身是有性能开销的&#xff0c;如果把使用的线程对象存起来下次用的时候直接取出来用就省去了一次创建和销毁的成本&a…

Scroll生态项目Penpad,再获Presto Labs的投资

Penpad是Scroll生态的LaunchPad平台&#xff0c;其整计划像收益聚合器以及RWA等功能于一体的综合性Web3平台拓展&#xff0c;该平台在近期频获资本市场关注&#xff0c;并获得了多个知名投资者/投资机构的支持。 截止到本文发布前&#xff0c;Penpad已经获得了包括Scroll联合创…

基于vue.js+thymeleaf模板引擎+ajax的注册登陆简洁模板(含从零到一详细介绍)

文章目录 前言1、数据库准备2、工具类与相关基类使用2.1、工具类2.2、相关基类 3、web包目录说明4、注册功能设计&#xff08;本文核心部分&#xff09;4.1、注册页面设计4.2、注册逻辑设计 5、登陆功能设计5.1、登陆页面设计5.2、登陆逻辑设计 6、运行效果图 前言 大多数的网…

(MATLAB)安装指南

参考链接&#xff1a;MATLAB2019a安装教程&#xff08;避坑版&#xff09;

智能健康管理系统的一次新体验

智能健康管理系统是一个集成了多方面数据资源&#xff0c;并配合人工智能算法的健康管理系统。该系统的应用涉及多个领域&#xff0c;包括医学、科学、生态和医疗保健等。其服务对象包括健康人群、亚健康人群和疾病人群&#xff0c;旨在通过病因预防、临床前期预防和临床预防三…

Autosar PNC网络管理配置-UserData的使用

文章目录 前言ComComSignalComIPdu CanNmSignal Mapping总结 前言 之前配置的网络管理报文中的data都由ComM管理&#xff0c;后面客户新增了需求&#xff0c;最后两个byte需要发送Wakeup Reason&#xff0c;本文记录一下相关配置的修改 Com ComSignal 之前配置的PN_TX&…

后仿真中的关于延时问题(物理特性角度)

大家都知道&#xff0c;后仿真讲究仿真时序。那么&#xff0c;在网表阶段&#xff0c;接触到后仿延时问题。今天总结一下。 一 延时概念和分类 1.1 分布式延迟&#xff08;Distributed Delays&#xff09; 一般用来指定模块内部信号通过逻辑单元或者线网耗费的时间。 1.2 模…

Linux进程通信-信号

信号概念 信号是 Linux 进程间通信的最古老的方式之一&#xff0c;是事件发生时对进程的通知机制&#xff0c;有时也称之为软件中断&#xff0c;它是在软件层次上对中断机制的一种模拟&#xff0c;是一种异步通信的方式。信号 可以导致一个正在运行的进程被另一个正在运行的异…

STM32——基础篇

技术笔记&#xff01; 一、初识STM32 1.1 ARM内核系列 A 系列&#xff1a;Application缩写。高性能应用&#xff0c;比如&#xff1a;手机、电脑、电视等。 R 系列&#xff1a;Real-time缩写。实时性强&#xff0c;汽车电子、军工、无线基带等。 M 系列&#xff1a;Microcont…