weixin_43603037 2023-01-17 22:53 采纳率: 85.7%
浏览 44
已结题

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

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”
  • 写回答

2条回答 默认 最新

  • a5156520 2023-01-18 10:30
    关注

    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月5日
  • 已采纳回答 1月28日
  • 创建了问题 1月17日

悬赏问题

  • ¥15 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
  • ¥15 vscode程序一直报同样的错,如何解决?
  • ¥15 关于使用unity中遇到的问题
  • ¥15 开放世界如何写线性关卡的用例(类似原神)
  • ¥15 关于并联谐振电磁感应加热
  • ¥60 请查询全国几个煤炭大省近十年的煤炭铁路及公路的货物周转量
  • ¥15 请帮我看看我这道c语言题到底漏了哪种情况吧!
  • ¥66 如何制作支付宝扫码跳转到发红包界面
  • ¥15 pnpm 下载element-plus
  • ¥15 解决编写PyDracula时遇到的问题