txt文本处理

在对交换机配表的任务中需要对配表过程进行一系列改动,其中因为表的数量和表内容和之前相比增加了非常多,因此再使用之前的方法(手动计算为二进制)变得很麻烦,因此本文的工作便是使用C++将特定目录下的txt(十六进制+十进制)转化到特定目录下的一个总表里面。也可以使用python进行处理,处理过程会很简洁。输入如下图:
在这里插入图片描述
注: 每个表的第一行为此表之后数据的位宽(bit),例如Index1.txt中第一行为20、15、25、8,分别对应第二行的60、17、18、0转化为二进制后在总表中的位宽。第一行之后的开头8位为十六进制数据。
程序的输出如下图:
在这里插入图片描述
在此程序中主要用到了四个函数:
FindFirstFile: 用于查找目录下第一个txt,
FindNextFile: 和上面的函数共同使用,查找剩余的txt,
fprintf和fwrite: 用于向txt写入数据。
由于分了两次查找txt,因此FindFirstFile下面的程序和FindNextFile下面的程序重复。应该是有其它函数可以分别查找任意目录下的所有txt,之后找到了再进行优化。

tb.cpp如下:

#define  _CRT_SECURE_NO_WARNINGS
//#include "tb.h"
#include "H_to_B.h"
#include "D_to_B.h"
using namespace std;

int main()
{
	unsigned char zero_module[] = "00000000000000000000000000000000000000000000000000000000000000000000000000000000";//number=80,只需超过最大数据位宽即可
	int SCH_ZERO_SUPP[] = { 20, 15, 25 ,4};//发送调度表各个数据位宽
	int line = 0;//行号
	int ZERO_SUPP[20];
	int k = 0;//下标
	memset(ZERO_SUPP, 0, 20);

	char DATA_C[20] = { "" };

	FILE *fp, *fp_total;
	int flag_count[10];
	char str[100];
	char *data_rs = new char[20];
	int filedataD[8] = { 0 }, dataB[4];
	WIN32_FIND_DATA p;
	int length=0;
	
	/* 打开table_for_all,可读,在末尾写 */
	fp_total = fopen(TOTAL_TABLE_NAME, "w");
	if (fp_total == NULL){
		printf("open table_total failed!\n");
		return 0;
	}
	/* 读取该文档下的第一个txt */
	HANDLE h = FindFirstFile(FILE_DIRECTORY, &p);
	//puts(p.cFileName);

	fp = fopen(p.cFileName, "r");
	if (fp == NULL){
		puts("open other file failed!\n");
		return 0;
	}
	while (fgets(str, 60, fp) != NULL){
		line++;
		if (line == 1){
			//第一行为各个数据的位宽
			k = 0;
			for (int i = 0; i < strlen(str) + 1; i++){
				if (((str[i] == ' ') || (str[i] == '\n') || (str[i] == '\0')) && (str[i - 1] != '\n')){
					flag_count[k] = i;
					k++;
				}
			}
			int SUM = 0,length=0;
			for (int j = 0; j < (k-1); j++){
				length = flag_count[j + 1] - flag_count[j] - 1;
				int q = 0;
				for (int m = 0; m <length ; m++){
					SUM += ((str[flag_count[j]+1+q] - '0')*pow(10,length-1-m));
					q++;
				}
				ZERO_SUPP[j] = SUM;
				//printf("SUM=%d\n", SUM);
				SUM = 0;
			}
		}
		else {
			//char转换为int,
			for (int i = 0; i < 8; i++){
				if (str[i] >= '0'&&str[i] <= '9')
					filedataD[i] = str[i] - 48;
				else if (str[i] >= 'A'&&str[i] <= 'Z')
					filedataD[i] = str[i] - 55;
				else if (str[i] >= 'a'&&str[i] <= 'z')
					filedataD[i] = str[i] - 87;
				else{
					puts("error\n");
					return 0;
				}
				h_to_b(filedataD[i], dataB);
				//写入数据
				for (int k = 0; k < 4; k++){
					//printf("%d", dataB[k]);
					fprintf(fp_total, "%d", dataB[k]);
				}
			}
			//printf("%d\n", strlen(str));
			k = 0;
			for (int i = 8; i < strlen(str) + 1; i++){
				if (((str[i] == ' ') || (str[i] == '\n') || (str[i] == '\0')) && (str[i - 1] != '\n')){
					flag_count[k] = i;
					k++;
				}
			}
			int reallength;
			for (int j = 0; j < (k - 1); j++){
				memset(data_rs, 0, 20);
				memset(DATA_C, 0, 20);
				d_to_b(str, flag_count[j], flag_count[j + 1], &length, data_rs);
				datareverse(length, data_rs, DATA_C);
				reallength = ZERO_SUPP[j] - length;
				//printf("%d\n", reallength);
				fwrite(zero_module, reallength, 1, fp_total);
				fprintf(fp_total, "%s", DATA_C);

			}
			fprintf(fp_total, "\n");
			//printf("len=%d\n", strlen(str));
			//puts(str);
		}
	}
	line = 0;
	fclose(fp);


	/* 读取剩余txt */
	while (FindNextFile(h, &p))
	{
		//puts(p.cFileName);
		if (strcmp(p.cFileName,"total_table.txt")!=0){
			//非total_table.txt
			fp = fopen(p.cFileName, "r");
			if (fp == NULL)
			{
				printf("open %s failed\n", p.cFileName);
				return 0;
			}
			while (fgets(str, 60, fp) != NULL)
			{
				line++;
				if (line == 1){
					//第一行为各个数据的位宽
					k = 0;
					for (int i = 0; i < strlen(str) + 1; i++){
						if (((str[i] == ' ') || (str[i] == '\n') || (str[i] == '\0')) && (str[i - 1] != '\n')){
							flag_count[k] = i;
							k++;
						}
					}
					int SUM = 0, length = 0;
					for (int j = 0; j < (k - 1); j++){
						length = flag_count[j + 1] - flag_count[j] - 1;
						int q = 0;
						for (int m = 0; m <length; m++){
							SUM += ((str[flag_count[j] + 1 + q] - '0')*pow(10, length - 1 - m));
							q++;
						}
						ZERO_SUPP[j] = SUM;
						//printf("SUM=%d\n", SUM);
						SUM = 0;
					}
				}
				else {
					//char转换为int,
					for (int i = 0; i < 8; i++){
						if (str[i] >= '0'&&str[i] <= '9')
							filedataD[i] = str[i] - 48;
						else if (str[i] >= 'A'&&str[i] <= 'Z')
							filedataD[i] = str[i] - 55;
						else if (str[i] >= 'a'&&str[i] <= 'z')
							filedataD[i] = str[i] - 87;
						else{
							puts("error\n");
							return 0;
						}
						h_to_b(filedataD[i], dataB);
						//写入数据
						for (int k = 0; k < 4; k++){
							//printf("%d", dataB[k]);
							fprintf(fp_total, "%d", dataB[k]);
						}
					}
					//printf("%d\n", strlen(str));
					k = 0;
					for (int i = 8; i < strlen(str) + 1; i++){
						if (((str[i] == ' ') || (str[i] == '\n') || (str[i] == '\0')) && (str[i - 1] != '\n')){
							flag_count[k] = i;
							k++;
						}
					}
					int reallength;
					for (int j = 0; j < (k - 1); j++){
						memset(data_rs, 0, 20);
						memset(DATA_C, 0, 20);
						d_to_b(str, flag_count[j], flag_count[j + 1], &length, data_rs);
						datareverse(length, data_rs, DATA_C);
						reallength = ZERO_SUPP[j] - length;
						//printf("%d\n", reallength);
						fwrite(zero_module, reallength, 1, fp_total);
						fprintf(fp_total, "%s", DATA_C);

					}
					fprintf(fp_total, "\n");
					//printf("len=%d\n", strlen(str));
					//puts(str);
				}
			
			}
			line = 0;
			fclose(fp);
		}
	}
	fclose(fp_total);
	printf("SUCCESS!\n");
	system("pause");
	return(0);
}

主程序使用到的函数在如下的两个.c文件中:

D_to_B.cpp:

#define  _CRT_SECURE_NO_WARNINGS
#include "D_to_B.h"
#include "H_to_B.h"

//十进制转化为二进制
void d_to_b(char* d, int start, int last,int *len,char* da)
{
	int filedataB[10], DATA = 0, length, flength;
	char DATA_BIN_reverse[20] = { "" };

	length = last - start - 1;
	flength = length;
	//char->int
	for (int m = 0; m < length; m++){
		filedataB[m] = d[start + m + 1] - 48;
		DATA += filedataB[m] * pow(10, flength - 1);
		flength--;
	}
	//printf("DATA=%d\n", DATA);
	//d->b
	int i = 0;
	while (1){
		da[i] = (DATA % 2)+'0';
		DATA /= 2;
		if (DATA == 0)
			break;
		i++;
	}
	*len = i+1;
	//puts(DATA_BIN_reverse);
}

void datareverse(int l,char* data_res,char *data_for ){
	char DATA_BIN_forward[20] = { "" },DATA_C[20] = { "" };
	int count=l-1;
	for (int j = 0; j < l; j++){
		DATA_BIN_forward[j] = data_res[count];
		count--;
		//printf("DATA_BIN_forward=%c\n", DATA_BIN_forward[j]);
	}
	strcat(data_for, DATA_BIN_forward);
	//puts(DATA_C);

}

H_to_B.cpp:

#include "H_to_B.h"
//十六进制转为二进制&写入总表
void h_to_b(int h, int *b)
{
	for (int j = 3; j >= 0; j--)
	{
		b[j] = (h % 2);
		h /= 2;
	}
}

头文件如下:
tb.h:

#include <stdio.h>
#include <string.h>
#include <Windows.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

//txt 目录
#define FILE_DIRECTORY	".\\table\\*.txt"

#define TOTAL_TABLE_NAME	".\\table\\total_table.txt"

D_to_B.h:

#include "tb.h" 
//十进制转化为二进制
void d_to_b(char* d, int start, int last,int *len,char * da);
void datareverse(int l, char* data_res,char* data_for);

H_to_B.h:

//#include "tb.h" 
//十六进制转为二进制
void h_to_b(int h, int *b);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值