给指定文件添加输入的序号数据行,代码如下:
#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