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个字节的连续空间
上面开辟空间的方式有两个特点:
- 开辟的空间大小是固定的,也就是不能修改的。
- 数组在声明的时候,必须知道数组长度,它所需要的内存在编译时就已经分配好了。
但是很多时候,我们对于空间的需求上面的两种情况是满足不了的,有的时候我们需要的内存大小要程序运行之后才能知道,或者说有时候数组大小空间不够了,那么数组编译时开辟的内存空间的方式就不可行了,这个时候就需要动态内存开辟了。
注意:动态开辟
的内存是在堆
上的,而我们使用的局部变量和函数的形参是在栈
上开辟空间。
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");