在对交换机配表的任务中需要对配表过程进行一系列改动,其中因为表的数量和表内容和之前相比增加了非常多,因此再使用之前的方法(手动计算为二进制)变得很麻烦,因此本文的工作便是使用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);