if (NULL == fp1)
{
printf("open file COM4_2023-01-09_17.33.45.obs");
}
if (NULL == fp2)
{
printf("open file 321.txt");
}
//一般的判断文件打开状态
rewind(fp1); //指针指向文件开头
int i;
char ch, ch1;
char buf1[1024];
int x1 = 0;
int x2 = 0;
while (!feof(fp1))
{
//fgets(buf1, 1024, fp1); // 读取一行字符到buf1字符数组
////printf("buf1=%s\n",buf1);
//// strlen(buf1) 读取的这行字符的长度,
//// 如果读取到此行结束的换行符,则strlen(buf1)-1 为换行符的位置,strlen(buf1)-2为肉眼可见的最后一个字符
//if (buf1[strlen(buf1) - 23] == '5') { // 如果读取的这行字符倒数第一个字符为'5',则复制此行及接下来5行到2.txt
// fprintf(fp2, "%s", buf1); // 将此行写入2.txt
// // 读取接下来5行,写入2.txt
// for (i = 0; i < 5; i++) {
// fgets(buf1, 1024, fp1);
// fprintf(fp2, "%s", buf1);
// }
//}
//else { // 如果不是'5'结尾,则将接下来5行读走
// for (i = 0; i < 5; i++) {
// fgets(buf1, 1024, fp1);
// //fprintf(fp2,"%s",buf1);
// }
//}
fgets(buf1, 1024, fp1);
switch (buf1[strlen(buf1) - 23])
{
case '1':
printf("%c", buf1[strlen(buf1) - 23]);
fgets(buf1, 1024, fp1);
case '2':
printf("%c", buf1[strlen(buf1) - 23]);
fgets(buf1, 1024, fp1);
fgets(buf1, 1024, fp1);
case '3':
printf("%c", buf1[strlen(buf1) - 23]);
fgets(buf1, 1024, fp1);
fgets(buf1, 1024, fp1);
fgets(buf1, 1024, fp1);
case '4':
printf("%c", buf1[strlen(buf1) - 23]);
fgets(buf1, 1024, fp1);
fgets(buf1, 1024, fp1);
fgets(buf1, 1024, fp1);
fgets(buf1, 1024, fp1);
case '5':
printf("%c", buf1[strlen(buf1) - 23]);
fprintf(fp2, "%s", buf1);
for (i = 0; i < 5; i++)
{
fgets(buf1, 1024, fp1);
fprintf(fp2, "%s", buf1);
}
default:
printf("%c", buf1[strlen(buf1) - 23]);
}
}
fclose(fp1);
fclose(fp2);
fp1 = NULL;
fp2 = NULL;
printf("复制数据完毕!\n");
return 0;
}
数据是这种模板:
0 2023 01 10 09 17 56.5080000 0 5
A11 24444444 44444422 999999
A13 24444444 44444422 999999
A14 24444444 44444422 999999
A16 24444444 44444422 999999
D23 2843.492 24.000
0 2023 01 10 09 17 56.5080000 0 5
A11 24444444 44444422 999999
A13 24444444 44444422 999999
A14 24444444 44444422 999999
A16 24444444 44444422 999999
D23 2843.492 24.000
0 2023 01 10 09 17 56.5080000 0 5
A11 24444444 44444422 999999
A13 24444444 44444422 999999
A14 24444444 44444422 999999
A16 24444444 44444422 999999
D23 2843.492 24.000
0 2023 01 10 09 17 56.5080000 0 5
A11 24444444 44444422 999999
A13 24444444 44444422 999999
A14 24444444 44444422 999999
A16 24444444 44444422 999999
D23 2843.492 24.000
0 2023 01 10 09 17 56.5080000 0 5
A11 24444444 44444422 999999
A13 24444444 44444422 999999
A14 24444444 44444422 999999
A16 24444444 44444422 999999
D23 2843.492 24.000
1、这个长短的阴影可能是空格字符或者制表符,在读取每组第一行时,去除末尾的空格或制表符即可;
2、后面这个小数点应该是printf("%c", buf1[strlen(buf1) - 23])这行代码,打印了读取的数据中的小数点字符;
根据以上判断,修改如下:
参考链接:
#include <stdio.h>
#include <string.h>
int main(void){
FILE * fp1 = fopen("0118.txt","r");
FILE * fp2 = fopen("0118result.txt","w");
if (NULL == fp1)
{
printf("open file COM4_2023-01-09_17.33.45.obs");
}
if (NULL == fp2)
{
printf("open file 321.txt");
}
//一般的判断文件打开状态
rewind(fp1); //指针指向文件开头
int i;
char ch, ch1;
char buf1[1024];
int x1 = 0;
int x2 = 0;
while (!feof(fp1))
{
fgets(buf1, 1024, fp1);
// printf("(buf1[strlen(buf1) - 23=%c\n",buf1[strlen(buf1) - 23]);
// 如果buf1数组能容纳一行的字符,
//则strlen(buf1)为读取的一行字符串结尾的空字符'\0'
// strlen(buf1)-1为每行结尾的换行符
// strlen(buf1)-2往前的字符则为其他字符,如每行可见字符,或者是空格
i=strlen(buf1)-2; // 读取的换行符前一个字符开始判断
int findSapce=0;
// printf("buf1[strlen(buf1)-2]=%c,%d\n",buf1[strlen(buf1)-2],buf1[strlen(buf1)-2]);
// 去除每行最后一个数字字符后面的空格
while(findSapce==0){
if(buf1[i]!=' '&&buf1[i]!='\t'){ //如果不是空格,根据数据的格式,此字符就是数字字符,此处判断可以根据数据格式进行修改
buf1[i+1]='\n'; // 在这个数字字符后一个字符加上换行符
buf1[i+2]='\0'; // 在换行符后面加上字符串结尾的空字符'\0'
findSapce=1;
break; // 退出循环
}
i--; //判断前一个字符
}
int len = buf1[(strlen(buf1)-2)]-'0'; // 把每组第一行最后一个数字字符转为数字,以便判断接下来读取几行数据到fp2
if(len>0){
fprintf(fp2,"%s",buf1); // 把每组第一行写入fp2
for(i=0;i<len;i++){ // 根据每组第一行最后一个数字字符对应的数字,判断接下来读取几行到fp2,使用循环来代替switch-case更简洁,switch-case也可以实现
fgets(buf1, 1024, fp1);
fprintf(fp2, "%s", buf1);
}
}
}
fclose(fp1);
fclose(fp2);
fp1 = NULL;
fp2 = NULL;
printf("复制数据完毕!\n");
return 0;
}
0118.txt(测试数据文件):
0 2023 01 10 09 17 56.5080000 0 5
A11 24444444 44444422 999991
A13 24444444 44444422 999999
A14 24444444 44444422 999999
A16 24444444 44444422 999999
D23 2843.492 24.000
0 2023 01 10 09 17 56.5080000 0 2
A11 24444444 44444422 999991
D23 2843.492 24.000
0 2023 01 10 09 17 56.5080000 0 0
0 2023 01 10 09 17 56.5080000 0 5
A11 24444444 44444422 999992
A13 24444444 44444422 999999
A14 24444444 44444422 999999
A16 24444444 44444422 999999
D23 2843.492 24.000
0 2023 01 10 09 17 56.5080000 0 5
A11 24444444 44444422 999993
A13 24444444 44444422 999999
A14 24444444 44444422 999999
A16 24444444 44444422 999999
D23 2843.492 24.000
0 2023 01 10 09 17 56.5080000 0 5
A11 24444444 44444422 999994
A13 24444444 44444422 999999
A14 24444444 44444422 999999
A16 24444444 44444422 999999
D23 2843.492 24.000
0 2023 01 10 09 17 56.5080000 0 5
A11 24444444 44444422 999995
A13 24444444 44444422 999999
A14 24444444 44444422 999999
A16 24444444 44444422 999999
D23 2843.492 24.000
0 2023 01 10 09 17 56.5080000 0 4
A11 24444444 44444422 999996
A13 24444444 44444422 999999
A14 24444444 44444422 999999
D23 2843.492 24.000
0 2023 01 10 09 17 56.5080000 0 5
A11 24444444 44444422 999997
A13 24444444 44444422 999999
A14 24444444 44444422 999999
A16 24444444 44444422 999999
D23 2843.492 24.000
程序输出数字后面带小数点可能是因为在输出数字时使用了%f类型的输出格式,而实际数据是整数类型,导致输出时会多出小数点。应该改成%d类型的输出格式。