600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > C语言 从txt文件中提取特定的数据

C语言 从txt文件中提取特定的数据

时间:2023-04-20 06:26:02

相关推荐

C语言 从txt文件中提取特定的数据

C语言:从txt中逐行读取文本,提取其中的特殊数据

在Matlab中几行正则化的操作,C中尝试实现。

问题描述

在大量的txt中提取其中的特定数据

例如:

Labeled Markers (4):Marker #0: (1328.75, 11944.2, 2341.06)Marker #1: (1369.61, 12198.9, 2329.24)Marker #2: (1463.51, 1.9, 2321.44)Marker #3: (1217.63, 12047, 2334.84)Devices (0):Force Plates: (0)Eye Trackers: (0)

其中,想要提取Marker #0:后面的三个坐标信息

实现过程

按照:打开文件、逐行读取、判断字符是否为Marker、读取其中的数字的思路进行

需要的函数有fopenfgetsstrstratofmemset

注意:在VS中使用fopen会报错,在文件开头添加一句

#pragma warning(disable:4996);

即可解决。

fgets的声明 :

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

str – 这是指向一个字符数组的指针,该数组存储了要读取的字符串。

n – 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。

stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。

如果使用循环,fgets的指针在指到 ‘\0’ 后会自动移到下一行,这样可以实现逐行读取的功能。

如何判断该行文本存在目标数据

对比该行的前几个字符串是否是目标数据前的字符串,通常情况下,如果这个txt生成时是按照固定格式打印的,那么这个字符串有固定的格式。

源代码如下:

char num;char str_a[20000];int j = 0, num_k = 0;// 文件打开FILE* fin;fin = fopen("E:/001.txt", "r");for (int i = 0; i < 1000; i++){fgets(str_a, 80, fin);char buf1[50];// 检测到Marker字符串,开始读取if (strstr(str_a, "Marker") != NULL){printf("%s\n", str_a);int a_j = 0, k = 0;char str2 = '(';// 遍历该行字符串for (int a_i = 0; str_a[a_i] != '\0'; a_i++) {// 如果为空,空字符与字符比较会引发异常if (str_a[a_i] != ' ') {if (str_a[a_i] == str2) {k = 1; // k=1,开始读数}}// 判断开始读数、是否为数、是否为小数点if (k == 1 && str_a[a_i] >= '0' && str_a[a_i] <= '9' || str_a[a_i] == '.') {buf1[a_j] = str_a[a_i];a_j++;}// 判断开始读数、遇到,或)停止if (k == 1 && (str_a[a_i] == ',' || str_a[a_i] == ')')) {// char转为double类型,buf1置零Num[num_k] = atof(buf1);memset(buf1, 0, sizeof(buf1));a_j = 0;num_k++;}}buf1[a_j] = '\0';}Sleep(1);}

总结

初学C语言,最近的任务是把Matlab中已经写好的代码迁移到C中,写写blog对比Matlab和C实现的不同。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。