C语言读写文件如何解决

C语言出现几个我不太懂的现象
1.我不太明白图片中的阴影部分(图片在下面),有长有短是什么意思(导致我读第一行最后一个字符必须用buf1[strlen(buf1) - 23]) 2.我不太明白我这个代码运行出来,结果是数字后面带个小数点,我不明白小数点是从哪里来的
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;

}

img

img

数据是这种模板:
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

img

程序输出数字后面带小数点可能是因为在输出数字时使用了%f类型的输出格式,而实际数据是整数类型,导致输出时会多出小数点。应该改成%d类型的输出格式。