C语言——读写TXT文件中的(多行多列矩阵型)浮点型数据的两种方式

news2024/11/17 14:28:56

C语言——读写TXT文件中的(多行多列矩阵型)浮点型数据

  • 将要提取的数据
  • 方式一:将数据按行读取并写入到结构体数组中
    • 读取一个文件中的数据
    • 读取两个文件中的数据
    • 报错解决:0x00007FF6C90AB2C7 处有未经处理的异常(在 sfann_sins.exe 中): 0xC00000FD: `Stack overflow` (参数: 0x0000000000000001, 0x00000040B0203000)。
  • 方式二:将数据按行读取并写入到malloc数组中
    • malloc函数使用形式
    • free函数
  • 读取两个文档中的数据
  • 输出TXT文件

将要提取的数据

在这里插入图片描述
在这里插入图片描述

方式一:将数据按行读取并写入到结构体数组中

文本行输入函数:fgets(读文本)
函数原型

char *fgets(char *str, int n, FILE *stream);

参数
str– 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
n– 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
stream– 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
功能
从指定的流 stream 读取一行,并把它存储在str所指向的字符串内。当读取(n-1)个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
其他读取文件的方式请看我的另一篇博客:C语言文件读写操作

读取一个文件中的数据

//wm_e, wm_d, wm_u, vm_e, vm_d, vm_u, t_c
struct imuFile
{
	double wm_e;	 
	double wm_d;
	double wm_u;			 
	double vm_e; 
	double vm_d; 
	double vm_u; 
	double t_c;	
};

	struct imuFile imu[M] = { 0 };//创建结构体 
	FILE* fp = fopen("imu.txt", "r");// 打开文件,读文件
	if (fp == NULL) {
		fprintf(stderr, "文件打开失败.\n");
		exit(EXIT_FAILURE);
	}
	
	char row[N];
	int i = 0;
	while (fgets(row, N, fp) != NULL) {
			//printf("%s", row);//
			sscanf(row,"%lf	%lf	%lf	%lf	%lf	%lf %lf", &imu[i].wm_e, &imu[i].wm_d, &imu[i].wm_u, &imu[i].vm_e, &imu[i].vm_d, &imu[i].vm_u, &imu[i].t_c);//把数据存入结构体数组 
			//printf("%1.5e\t%1.5e\t%1.5e\t%1.5e\t%1.5e\t%.7lf\t%.2lf\n", imu[i].wm_e, imu[i].wm_d, imu[i].wm_u, imu[i].vm_e, imu[i].vm_d, imu[i].vm_u, imu[i].t_c);//
			i++;
			}
	fclose(fp);
	return 0;
}		

在这里插入图片描述

读取两个文件中的数据

#define N 85
#define M 9999

//wm_e, wm_d, wm_u, vm_e, vm_d, vm_u, t_c
struct imuFile
{
	double wm_e;	 
	double wm_d;
	double wm_u;			 
	double vm_e; 
	double vm_d; 
	double vm_u; 
	double t_c;	
};

//att1, att2, att3, vn_e, vn_d, vn_u, pos_e, pos_d, pos_u
struct gpsFile
{
	double att1;
	double att2;
	double att3;
	double vn_e;
	double vn_d;
	double vn_u;
	double pos_e;
	double pos_d;
	double pos_u;
};

	struct imuFile imu[M] = { 0 };//创建结构体 
	struct gpsFile gps[M] = { 0 };//创建结构体 

	FILE* fp = fopen("imu.txt", "r");// 打开文件,读文件
	if (fp == NULL) {
		fprintf(stderr, "文件打开失败.\n");
		exit(EXIT_FAILURE);
	}

	FILE* fpgps = fopen("gps.txt", "r");// 打开文件,读文件
	if (fpgps == NULL) {
		fprintf(stderr, "文件打开失败.\n");
		exit(EXIT_FAILURE);
	}

	char row[N];
	char row_gps[N];
	int i = 0;
	while (fgets(row, N, fp) != NULL && fgets(row_gps, N, fpgps) != NULL) {
			//printf("%s", row);//
			sscanf(row,"%lf	%lf	%lf	%lf	%lf	%lf %lf", &imu[i].wm_e, &imu[i].wm_d, &imu[i].wm_u, &imu[i].vm_e, &imu[i].vm_d, &imu[i].vm_u, &imu[i].t_c);//把数据存入结构体数组 
			sscanf(row_gps, "%lf	%lf	%lf	%lf	%lf	%lf %lf	%lf %lf", &gps[i].att1, &gps[i].att2, &gps[i].att3, &gps[i].vn_e, &gps[i].vn_d, &gps[i].vn_u, &gps[i].pos_e, &gps[i].pos_d, &gps[i].pos_u);
			//printf("%1.5e\t%1.5e\t%1.5e\t%1.5e\t%1.5e\t%.7lf\t%.2lf\n", imu[i].wm_e, imu[i].wm_d, imu[i].wm_u, imu[i].vm_e, imu[i].vm_d, imu[i].vm_u, imu[i].t_c);//
			}

	fclose(fp);
	fclose(fpWrite);
	
	return 0;
}		

报错解决:0x00007FF6C90AB2C7 处有未经处理的异常(在 sfann_sins.exe 中): 0xC00000FD: Stack overflow (参数: 0x0000000000000001, 0x00000040B0203000)。

在这里插入图片描述
原因:数组太大,栈空间不够用导致栈溢出!!!
解决办法:调试——》调试属性——》连接器——》系统——》修改堆栈保留/提交大小
在这里插入图片描述


> 读取大量数据时不建议使用结构体数组的方式输出!!!建议使用动态内存扩展的方式

在这里插入图片描述

方式二:将数据按行读取并写入到malloc数组中

创建变量或者数组就是我们常见的内存开辟方式

int num = 100;//开辟4个字节的空间
int arr[10] = {0};//开辟40个字节的连续空间

上面开辟空间的方式有两个特点:

  1. 开辟的空间大小是固定的,也就是不能修改的。
  2. 数组在声明的时候,必须知道数组长度,它所需要的内存在编译时就已经分配好了。

但是很多时候,我们对于空间的需求上面的两种情况是满足不了的,有的时候我们需要的内存大小要程序运行之后才能知道,或者说有时候数组大小空间不够了,那么数组编译时开辟的内存空间的方式就不可行了,这个时候就需要动态内存开辟了。

注意:动态开辟的内存是在上的,而我们使用的局部变量和函数的形参是在上开辟空间。

malloc函数使用形式

关于malloc所开辟空间类型:malloc只开辟空间,不进行类型检查,只是在使用的时候进行类型的强转。
举个例子:‘我’开辟你所需要大小的字节大小空间,至于怎么使用是你的事
mallo函数返回的实际是一个无类型指针,必须在其前面加上指针类型强制转换才可以使用

指针自身 = (指针类型*)malloc(sizeof(指针类型)*数据数量)
int *p = NULL;
int n = 10;
p = (int *)malloc(sizeof(int)*n);

在使用malloc函数之前我们一定要计算字节数,malloc开辟的是用户所需求的字节数大小的空间。

free函数

作用:释放malloc(或calloc、realloc)函数给指针变量分配的内存空间。
注意:使用后该指针变量一定要重新指向NULL,防止悬空指针(失效指针)出现,有效规避错误操作。

int main()
{
	int *p = (int *)malloc(sizeof(int));
	*p = 100;
	free(p);
	p = NULL;
	return 0;

free函数在释放空间之后,把内存前的标志变为0,且为了防止数据泄露,它会把所释放的空间用cd进行填充。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N_imu 100
int main()
{
	FILE* fp = fopen("imu.txt", "r");// 打开文件,读文件
	if (fp == NULL) {
		fprintf(stderr, "文件打开失败.\n");
		exit(EXIT_FAILURE);
	}

	char* row = (char*)malloc(sizeof(char) * N_imu);
	double* ptr = (double*)malloc(sizeof(double) * 7);

	if (ptr == NULL)
	{
		printf("开辟内存失败!\n");
	}
	else
	{
		while (fgets(row, N_imu, fp) != NULL) {
			//printf("%s", row);//
			sscanf(row, "%lf	%lf	%lf	%lf	%lf	%lf %lf", ptr, ptr + 1, ptr + 2, ptr + 3, ptr + 4, ptr + 5, ptr + 6);
			int i = 0;
			for (i = 0; i < 7; i++)
			{
				printf("%.5e\t", *(ptr + i));
			}
			printf("\n");
		}
	}

	free(ptr);//释放空间
	free(row);
	ptr = NULL;//指向NULL
	row = NULL;
	
	return 0;
}

读取两个文档中的数据

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N_imu 100
#define N_gps 110   //尽可能比数据中的字符串大一些,否则会出现某些行的字符串大于指定长度时,重复打印的问题!!!!!

int main()
{
	FILE* fp = fopen("imu.txt", "r");// 打开文件,读文件
	if (fp == NULL) {
		fprintf(stderr, "文件打开失败.\n");
		exit(EXIT_FAILURE);
	}
	
	FILE* fp_gps = fopen("gps.txt", "r");
	if(fp_gps == NULL){
		fprintf(stderr, "文件打开失败.\n");
		exit(EXIT_FAILURE);
	}
	
	char* row = (char*)malloc(sizeof(char) * N_imu);
	char* row_gps = (char*)malloc(sizeof(char) * N_gps);
	double* ptr = (double*)malloc(sizeof(double) * 7);
	double* ptr_gps = (double*)malloc(sizeof(double) * 9);
	if (ptr == NULL && ptr_gps == NULL)
	{
		printf("开辟内存失败!\n");
	}
	else
	{
		while (fgets(row, N_imu, fp) != NULL && fgets(row_gps, N_gps, fp_gps) != NULL) {
			//printf("%s", row);//
			sscanf(row, "%lf	%lf	%lf	%lf	%lf	%lf %lf", ptr, ptr + 1, ptr + 2, ptr + 3, ptr + 4, ptr + 5, ptr + 6);
			sscanf(row_gps, "%lf	%lf	%lf	%lf	%lf	%lf %lf	%lf %lf", ptr_gps, ptr_gps + 1, ptr_gps + 2, ptr_gps + 3, ptr_gps + 4, ptr_gps + 5, ptr_gps + 6, ptr_gps + 7, ptr_gps + 8);
			int i = 0;
			for (i = 0; i < 7; i++)
			{
				printf("%.5e\t", *(ptr + i));
			}
			printf("\n");
			int j = 0;
			for (j = 0; j < 9; j++)
			{
				printf("%.5e\t", *(ptr_gps + j));
			}
			printf("\n");
		}
	}
	free(ptr);//释放空间
	free(row);
	ptr = NULL;//指向NULL
	row = NULL;

	return 0;
}

输出TXT文件

FILE* fpWrite = fopen("avpt.txt", "w");// 打开文件,写文件
	if (fpWrite == NULL)
	{
		return 0;
	}
while (fgets(row, N_imu, fp) != NULL) {
	//printf("%s", row);//
	sscanf(row, "%lf	%lf	%lf	%lf	%lf	%lf %lf", ptr, ptr + 1, ptr + 2, ptr + 3, ptr + 4, ptr + 5, ptr + 6);
	int i = 0;
	for (i = 0; i < 7; i++){
		fprintf(pfWrite, "%1.5e\t", *(ptr + i));
	}
	printf("\n");

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

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

相关文章

LabVIEW更高的吞吐量与更少的延迟2

LabVIEW更高的吞吐量与更少的延迟2上一篇《LabVIEW更高的吞吐量与更少的延迟1》介绍了吞吐量的内容&#xff0c;本次介绍延迟的相关内容。改善延迟有一些技术可以解决改善延迟的问题。围绕这一目标的两个主要工具是实时操作系统和FPGA。实时操作系统任何操作系统都会遇到抖动或…

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下

作为基础软件服务子系统的HarmonyOS HiViewDFX&#xff08;以下简称HiViewDFX&#xff09;框架&#xff0c;是HarmonyOS的公共基础设施。包括日志、事件、跟踪、故障管理及观测剖析五大部分&#xff0c;同时也提供了故障检测、定位和性能观测剖析的开发套件&#xff0c;以及将端…

操作系统权限提升(十一)之系统错误配置-启动项提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 操作系统权限提升(五)之系统错误配置-PATH环境变量提权 操作…

【前端】Vue项目:旅游App-(19)loading:网络请求时显示loading效果

文章目录目标过程与代码loading效果mainStore控制loading显示点击蒙板取消网络请求在网络请求处添加对loading的控制效果总代码修改或添加的文件loading.vueservice/request/indexstore/modules/mainApp.vue参考本项目博客总结&#xff1a;【前端】Vue项目&#xff1a;旅游App-…

自动化运维|云原生架构下的产品自动化发布、快速部署和持续交付实战之路

自动化运维|云原生架构下的产品自动化发布、快速部署和持续交付实战之路。 1.背景介绍 CI/CD是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。作为一种面向开发和运维团队的解决方案&#xff0c;CI/CD 主要针…

只做笔记有必要买apple pencil吗?平价电容笔排行榜

如今国内的电容笔&#xff0c;牌子也越来越多了&#xff0c;苹果原装电容笔虽然性能不错&#xff0c;但价格也非常昂贵&#xff0c;一般人是买不起的。现在市面上有很多可以取代原来的苹果电容笔的平替电容笔。下面&#xff0c;我给大家推荐几款电容笔&#xff0c;好用而且价格…

Java 文件IO操作基础,File,FileInputStream,FileOutputStream

什么是文件 有个时候我们程序中的数据不会直接保存&#xff0c;一旦程序断电&#xff0c;数据将不会存在&#xff0c;如果我们想要我们程序中的数据永久的保存起来&#xff0c;所以&#xff0c;java的文件io显得非常重要。 什么是文件流 创建文件 如下相关的文件io方法 new F…

【教程】Wireshark抓取抖音直播的OBS推流地址和密钥

真不用花钱去买提取推流码的软件。。。自己提取很简单的。 简单记录一下&#xff0c;以备自己需要时候忘了怎么搞。 1、电脑开热点&#xff0c;手机连接热点&#xff1b; 2、电脑安装wireshark软件&#xff0c;并选择WLAN或者以太网接口&#xff1b; 3、wireshark筛选rtmpt&am…

Kubernetes持久化Events到sentry

背景 Kubernetes中的事件最终还是存储在etcd中&#xff0c;默认情况下只保存1个小时&#xff0c;由于etcd并不支持一些复杂的分析操作&#xff0c;默认Kubernetes只提供了非常简单的过滤方式&#xff0c;比如通过Reason、时间、类型等。同时这些事件只是被动的存在etcd中&…

CAPL(vTESTStudio) - DOIP - UDP发送_03

继UDP接收的介绍完成后,今天我们介绍下UDP发送的函数,这里我们将我自主开发的函数整体都会介绍个大家,一般能够完成大家日常脚本开发中90%以上使用发送UDP的数据函数,绝对干货满满。 UDP发送 一、参数定义 无论DoIP发送报文的UDP还是TCP函数,亦或是CAN、CANFDLIN的发送函…

Redux了解及应用(三)

React - redux 使用&#xff08;由浅入深&#xff09;&#xff1a;https://blog.csdn.net/Jie_1997/article/details/128078971 这篇文章总结的很棒&#xff01;&#xff01;&#xff01;了解redux及应用直接看这篇文章即可 备注&#xff1a;第五节的第三小节&#xff0c;容器…

学习驱动的复杂软件符号执行

原文来自微信公众号“编程语言Lab”&#xff1a;学习驱动的复杂软件符号执行搜索关注“编程语言Lab”公众号&#xff08;HW-PLLab&#xff09;获取编程语言更多技术内容&#xff01;欢迎加入编程语言社区 SIG-编程语言测试&#xff0c;了解更多编程语言测试相关的技术内容。加入…

元宇宙:有人追捧,就会有人抵触

或许&#xff0c;直到现在&#xff0c;我们依然无法否认元宇宙即将对我们的生产和生活产生的深刻影响。即使是在它遭遇巨大的不确定性的大背景下&#xff0c;依然如此。 有人追捧&#xff0c;便有人抵触。元宇宙商用的止步不前&#xff0c;元宇宙技术的难以突破……几乎都是这…

为什么不进行穷举测试?

本章主要介绍不对所有可能性进行测试的原因&#xff0c;对于经理和测试人员&#xff0c;都应该了解测试是一种采样过程&#xff0c;需要了解采样给测试所带来的风险。 1、可进行测试的数目是无限的 如果不能查看代码内部逻辑&#xff0c;可输入的测试用例是无限的。当然还有在不…

第30章 分布式缓存强制删除触发器的触发调试

1 Services.Users.Caching.RoleCacheEventConsumer using Core.Caching; using Core.Domain.Users; using Services.Caching; namespace Services.Users.Caching { /// <summary> /// 摘要&#xff1a; /// 通过该类中的方法成员&#xff0c;在角色实体的1个实例…

Linux —— 文件系统概述、软硬链接与动静态库

目录 1.文件系统概述 1.1磁盘的基本存储结构 1.2磁盘的基本逻辑结构 1.3操作系统中的文件系统 1.4文件系统如何对磁盘进行管理 2.软链接、硬链接 2.1软链接 2.2硬链接 2.3目录的硬链接数 3.静态库和动态库 3.1静态库的制作 3.2静态库的使用 3.3动态库的制作 3.4动态…

年薪50k大佬带你五分钟学会接口自动化测试框架

今天&#xff0c;我们来聊聊接口自动化测试是什么&#xff1f;如何开始&#xff1f;接口自动化测试框架怎么做&#xff1f;自动化测试自动化测试&#xff0c;这几年行业内的热词&#xff0c;也是测试人员进阶的必备技能&#xff0c;更是软件测试未来发展的趋势。特别是在敏捷模…

分布式请求链路跟踪-SpringCloud Sleuth

文章目录1.概述1.1.为什么会出现这个技术&#xff1f; 需要解决哪些问题?1.2.是什么?1.3.如何解决问题?2.搭建链路监控步骤2.1.zipkin2.2.服务提供者2.3.服务消费者&#xff08;调用方&#xff09;2.4.测试1.概述 1.1.为什么会出现这个技术&#xff1f; 需要解决哪些问题?…

力扣刷题记录——1108. IP 地址无效化、1281. 整数的各位积和之差 次数 、1295. 统计位数为偶数的数字、1394. 找出数组中的幸运数

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——1108. IP 地址无效化、1281. 整数的各位…

手撕排序算法(一)——插入排序

排序的概念及意义本章内容我们采用C语言完成代码。排序的概念我们先来了解一下基础概念&#xff1a;排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性&#xff1a;假定在待排序…