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

这篇具有很好参考价值的文章主要介绍了C语言——读写TXT文件中的(多行多列矩阵型)浮点型数据的两种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

将要提取的数据

C语言——读写TXT文件中的(多行多列矩阵型)浮点型数据的两种方式
C语言——读写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;
}		

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

读取两个文件中的数据

#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)。

C语言——读写TXT文件中的(多行多列矩阵型)浮点型数据的两种方式
原因:数组太大,栈空间不够用导致栈溢出!!!
解决办法:调试——》调试属性——》连接器——》系统——》修改堆栈保留/提交大小
C语言——读写TXT文件中的(多行多列矩阵型)浮点型数据的两种方式


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

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

方式二:将数据按行读取并写入到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进行填充。文章来源地址https://www.toymoban.com/news/detail-401302.html

#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");

到了这里,关于C语言——读写TXT文件中的(多行多列矩阵型)浮点型数据的两种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hive多行转多列,多列转多行

    原始数据表 目标结果表 分析:目标表中的a和b是用分组形成,所以groupby字段选用原始表中col1,c、d、e是原始表中的行值,在目标表中成了列名,目标表中可以采用as做列名自定义,当原始表中的某一字段值等于某一特定值时,人为定义为结果表中的列名。 SQL实现 总结:多行

    2024年02月12日
    浏览(46)
  • Android开发创建txt文件并读写txt文件数据

    在Android开发过程中,经常会遇到需要创建txt文件并写入数据的情况。今天我们来介绍一下如何实现这样的功能。 代码中的mStrPath为txt文件存储的路径,根据个人的需求确定路径,此处以 根目录,并命名为transcript.txt 为例,即 1. 读出txt文件的数据 3. 写入txt数据 [注]: ①当F

    2024年02月12日
    浏览(46)
  • 【Python 文件读写】— txt文件

    目录 一、文件读写模式 二、读文件 1、所用函数 2、示例 三、写文件 1、所用函数 2、示例 四、另一种书写形式 1、读文件 2、写文件 模式 具体信息 r 文件只读,若文件不存在则报错 r+ 文件可读可写,若文件不存在则报错,写入时会覆盖原有内容 rb 文件只读(二进制形式),若

    2024年02月12日
    浏览(59)
  • python读写txt 文件

    一、读文件 步骤:打开 – 读取 – 关闭 f= open(‘D:pythontxt1.txt’) f.read() #返回txt 文件的所有内容 while True: lines = f.readline() # 按行读取数据,行自动+1 if not lines: break pass print(lines) 二、文件写入 f1= open(‘D:pythontxt1.txt’,‘w’) f1.write(‘5.5 5.6!’) f1.close() //只有close的时候文件才

    2023年04月09日
    浏览(40)
  • C# 读写TXT文件

    首先引入命名空间 using System.IO; 读TXT文件: 写TXT文件:

    2024年02月08日
    浏览(36)
  • Java读写txt文件

    如果想直接输出,将代码 strList.add(line); 换成 System.out.println(line); 就行。 方法加个返回值,可方便后续对内容的操作 调用 需要引入maven包 调用 方法中可以换成传字符串,那整个for循环就能替换成 info.write(str); 调用时就像下面这样

    2024年02月11日
    浏览(46)
  • 行转列--将多行数据转成多行多列的Table结构

    21年做的一个功能,涉及到将行数据转化成列数据。边查边做,一点一点的尝试着做好。当时感觉有点吃力。完成之后本想记录,但一直拖延至今。最近再次接手与这个功能相关的业务,整理了之前写的代码,趁此机会记录下来。 界面中是一个三级结构:L1级【Test Sample】,

    2024年02月05日
    浏览(52)
  • FPGA和matlab读写txt文件

    博主一般用matlab和VIVADO进行开发,常常碰到二者需要读写数据的问题,因此对matlab和FPGA读写数据做一个总结,主要是为了方便自己查阅,减少不必要的时间浪费,同时和大家做一个分享。 先创建一个句柄fid,然后再使用fscanf函数读取txt的数据。注意txt文件需在matlab当前文件

    2024年02月09日
    浏览(47)
  • 关于C#读写文本文件(.txt)的方法

    读写文本文件其实是件很简单的事情,本文主要给大家介绍了关于C#读写文本文件(.txt)的相关资料,需要的朋友可以参考下 读取txt文件 如果你要读取的文件内容不是很多,可以使用 File.ReadAllText(filePath) 或指定编码方式 File.ReadAllText(FilePath, Encoding)的方法。它们都一次性将文本内

    2024年02月15日
    浏览(38)
  • Rust ?运算符 Rust读写txt文件

    一、Rust ?运算符 ?运算符:传播错误的一种快捷方式。 如果Result是Ok:Ok中的值就是表达式的结果,然后继续执行程序。 如果Result是Err:Err就是整个函数的返回值,就像使用了return ?运算符只能用于返回Result的函数。 ?运算符与main函数 main函数返回类型是:() main函数的

    2024年02月22日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包