C语言的补缺所缺失的数据

问题是补充缺失数据
每一秒会输出7行数据,从DDA 001---到DDA 007,但是总会有某一秒会缺失数据,数据的格式如下

我想要的是不是固定格式的代码(意思是从肯以后的数据开头未必是DDA 001---DDA 007,也有可能是DDA 008---DDA 0013),我想过一种代码模式,就是我点运行程序键,然后程序会提示我输入DDA的号码,比如是这样的(请输入DDA:),然后我就输入(DDA001 DDA002 DD003...DDA007) ,这样它就能补齐缺失的数据 ,但是我不知道怎么写,

例如缺失DDA 003的数据,我希望补上DDA 003 0 0 0 0 0 0 0。

数据就是以上内容。

给指定文件添加输入的序号数据行,代码如下:


#include <stdio.h>
#include <string.h>

// https://www.cnblogs.com/yanglike111/p/13186285.html
int fun2(char *p)//将连续数字字符转换为整数
{
    int x=0;
    while(*p && *p>='0' && *p<='9')
    {
        x=x*10+*p-'0';
        p++;
    }
    return x;
 } 
int fun1(char *s,int *a) // 将字符串中第一个连续的数字字符串 转为对应的数字 
{
    int x,n;
    char *p;
    n=0;p=s;
    while(*p)
    {
        while(*p &&(*p<'0'||*p>'9'))
            p++;
        if(*p)
        {
            *a=fun2(p);
            break;
        }
        while(*p>='0' && *p<='9')
            p++;
    }
    return *a;
}


int insertOneData(char datas[][256],int len,int num){
    
    char temp[256];
// https://baike.baidu.com/link?url=4xkM2WPz-OQUCMjWcTdlDb1UnlqwPOF0nV2ONle1GGYCnq-7KREkLnRGCJ7rsw8zBWbJYBnS5OLdGMimAGc6FkY9nQptKCNAChTMgvn3WxW    
    sprintf(temp,"< DDA %03d 0 0 0 0 0 0\n",num); // 要添加的数据 
//    printf("insert temp=%s\n",temp);
    
    int i,j,num1=-1,num2=-1;
    fun1(datas[0],&num1);
    if(num<num1){  //要插入的数据序号小于所有序号 
            
        for(int t=len;t>i;t--){
            strcpy(datas[t],datas[t-1]);
        }
        strcpy(datas[i],temp);
        return 1;
    }
    
    fun1(datas[len-1],&num1);
    if(num>num1){  // 要插入的序号在所有序号之后 
        
    
        strcpy(datas[len],temp);
        return 1;
    }
        
         
    for(i=0;i<len;i++){  // 要插入的序号在两个序号之间 
        
        fun1(datas[i],&num1);
        fun1(datas[i+1],&num2);
        if(num>num1&&num<num2){
            
            for(int t=len;t>i+1;t--){
                strcpy(datas[t],datas[t-1]);
            }
            strcpy(datas[i+1],temp);
            break;
        }
        
    }
    
    return 1;
    
}

int main(void){
    
    int num[350000];
    int i=0;
    
    printf("请输入要补充的序列号:");
    while(scanf("%d",&num[i])!=EOF){           
        i++;        
    }
//    printf("i=%d\n",i);
    
    FILE * fp = fopen("20230309data.txt","r");
    if(fp==NULL){
        printf("打开文件失败!\n");
        return -1;
    }
    FILE * fp2 = fopen("20230309data-result.txt","w");
    if(fp2==NULL){
        printf("打开文件失败  !\n");
        return -1;
    }
    char datas[100][256];
    char temp[256];
    int n=-1;
    int j=0;
    
    while(feof(fp)==0){
        
        // https://baike.baidu.com/item/fgets/10942211?fr=aladdin
        char * read = fgets(temp,256,fp); // 第一行 
        
        //printf("temp1=%s\n",temp);
        if(read!=NULL){
            fputs(temp,fp2);   
            
            fgets(temp,256,fp);  // 第二行 
            fputs(temp,fp2); 
            
            int row;
            fgets(temp,256,fp); // 第三行的数字
            //printf("temp3=%s\n",temp); 
            fputs(temp,fp2);  // 此处的数字没有修改为更新新增加条数 
            fun1(temp,&n); 
        //    printf("n=%d\n",n);
        
             
            
            for(j=0;j<n;j++){  // 读取n行 
                fgets(datas[j],256,fp);
            //    printf("datas[%d]=%s\n",j,datas[j]);
            }
            // 最后一行数据加个换行符 
            //datas[n-1][strlen(datas[n-1])] ='\n'; 
            //datas[n-1][strlen(datas[n-1])+1] ='\0';
            
            int k;
            int len=n;
            // 将读取的n行数据,添加要插入的序号数据到二维字符数组datas中 
            for(k=0;k<i;k++){
                int in = insertOneData(datas,len,num[k]);
                if(in==1){
                    len++;
                }
            }
            
            // 将插入的数据的二维数组datas中的数据写入文件 
            for(k=0;k<len;k++){
                fputs(datas[k],fp2);
            }    
            
            
            
        }else{
            break;
        }
    }    
    fclose(fp); 
    fclose(fp2);
    
    
    return 0;
    
} 

20230309data.txt(测试用数据文件内容):

>CLOCKMEASURES COM2 0 0.0 APPROXIMATE 0 1.000 00000000 0 1                     
< 209804000000000 0.000 0.000 0 1
< 4
< DDA 002 43.04 20972708.15 20972708.354 -168.820 5800 1575420000 18105da4
< DDA 003 26.18 20892411.42 20892410.244 -168.841 6678680 1176450000 01d05e24
< DDA 005 55.63 20892410.61 20892410.506 -168.825 6771600 1575420000 08105dc4
< DDA 006 55.63 20892410.61 20892410.506 -168.825 6771600 1575420000 08105dc4
>CLOCKMEASURES COM2 0 0.0 APPROXIMATE 0 1.000 00000000 0 1                     
< 209804000000000 0.000 0.000 0 1
< 5
< DDA 002 43.04 20972708.15 20972708.354 -168.820 5800 1575420000 18105da4
< DDA 003 26.18 20892411.42 20892410.244 -168.841 6678680 1176450000 01d05e24
< DDA 005 55.63 20892410.61 20892410.506 -168.825 6771600 1575420000 08105dc4
< DDA 006 55.63 20892410.61 20892410.506 -168.825 6771600 1575420000 08105dc4
< DDA 007 55.63 20892410.61 20892410.506 -168.825 6771600 1575420000 08105dc4
>CLOCKMEASURES COM2 0 0.0 APPROXIMATE 0 1.000 00000000 0 1                     
< 209804000000000 0.000 0.000 0 1
< 3
< DDA 002 43.04 20972708.15 20972708.354 -168.820 5800 1575420000 18105da4
< DDA 003 26.18 20892411.42 20892410.244 -168.841 6678680 1176450000 01d05e24
< DDA 005 55.63 20892410.61 20892410.506 -168.825 6771600 1575420000 08105dc4

img

该回答引用ChatGPT

以下是一个C语言的示例代码,它实现了从用户输入DDA号码并补全缺失数据的功能。这个代码使用了C语言中的结构体和动态内存分配来存储输入的DDA号码及其对应的数据行,并在缺失数据时自动补全。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_DDA_NUM 7
#define MAX_DATA_LEN 100

struct Data {
    char dda[10];
    int data[MAX_DDA_NUM];
};

int main() {
    struct Data *data_list = NULL;
    int data_num = 0;

    // 输入DDA号码和数据行
    while (1) {
        char input[20];
        printf("请输入DDA号码和数据行,格式如 DDA001 1 2 3 4 5 6 7 (输入q结束输入):\n");
        fgets(input, sizeof(input), stdin);
        if (input[0] == 'q') {
            break;
        }

        struct Data new_data;
        sscanf(input, "%s %d %d %d %d %d %d %d", new_data.dda, &new_data.data[0], &new_data.data[1], &new_data.data[2], &new_data.data[3], &new_data.data[4], &new_data.data[5], &new_data.data[6]);

        // 将新的数据加入数据列表
        data_num++;
        data_list = (struct Data *)realloc(data_list, sizeof(struct Data) * data_num);
        memcpy(&data_list[data_num-1], &new_data, sizeof(struct Data));
    }

    // 补全缺失数据
    for (int i = 0; i < data_num; i++) {
        struct Data cur_data = data_list[i];
        int is_missing = 0;

        for (int j = 0; j < MAX_DDA_NUM; j++) {
            if (cur_data.data[j] == 0) {
                is_missing = 1;
                break;
            }
        }

        if (is_missing) {
            // 找到缺失的DDA号码
            int missing_dda_index = -1;
            for (int j = 0; j < MAX_DDA_NUM; j++) {
                if (cur_data.data[j] == 0) {
                    missing_dda_index = j;
                    break;
                }
            }

            // 补全缺失的数据
            for (int j = 0; j < data_num; j++) {
                if (i != j) {
                    struct Data other_data = data_list[j];
                    if (strcmp(other_data.dda, cur_data.dda) != 0) {
                        cur_data.data[missing_dda_index] = other_data.data[missing_dda_index];
                        if (cur_data.data[missing_dda_index] != 0) {
                            break;
                        }
                    }
                }
            }
        }

        // 输出数据
        printf("%s ", cur_data.dda);
        for (int j = 0; j < MAX_DDA_NUM; j++) {
            printf("%d ", cur_data.data[j]);
        }
        printf("\n");
    }

    // 释放内存
    free(data_list);

    return 0;
}