weixin_43603037 2023-01-15 18:47 采纳率: 85.7%
浏览 52
已结题

C语言循环出现问题,该如何解决

C语言循环出现问题
目前这个程序的目的是:1.第一行的最后一个字符如果是“5”,那么就把下面5行(还有“5”的)这一行,总共六行,复制到另一份txt文件中,但是现在一直在循环不知道为什么?
FILE* fp1 = fopen("C:\\Users\\11251\\Desktop\\新建文件夹\\1.txt", "r");//只读
FILE* fp2 = fopen("C:\\Users\\11251\\Desktop\\新建文件夹\\2.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))
{
    for (i = 0; i < 35; i++)
    {
        ch = fgetc(fp1);
    }
    ch1 = ch;
    printf("%c\n", ch1);  //输出行数
    x1 = -(ftell(fp1)-x2);//文件指针的偏移量
    fseek(fp1, x1, SEEK_CUR);

    while (ch1 =='5')
    {
     
     
        for (i = 0; i < 6; i++)
        {
            fgets(buf1, sizeof(buf1), fp1);
            fputs(buf1, fp2);
        }
        x2 = ftell(fp1);
        printf("%d\n", x2);
       
    }
    
    
    
}  
fclose(fp1);
fclose(fp2);
fp1 = NULL;
fp2 = NULL;
return 0;
原始数据的模板是这样的:S SHSH S C 234 123 44 332303 44 5

102 74744747 99999 838383 838383 91 838383 32232
102 747442 99999 838383 44838383 7818838383 2232 23.000
277 199242 99999 838383 838383 19924838383 2232 2232 2232
236 199244 8099999 838383 41838383 1992838383 6 2232 22 222
d93 2222 222233
S SHSH S C 234 123 44 332303 44 5
102 74744747 99999 838383 838383 91 838383 32232
102 747442 99999 838383 44838383 7818838383 2232 23.000
277 199242 99999 838383 838383 19924838383 2232 2232 2232
236 199244 8099999 838383 41838383 1992838383 6 2232 22 222
d93 2222 222233
S SHSH S C 234 123 44 332303 44 5
102 74744747 99999 838383 838383 91 838383 32232
102 747442 99999 838383 44838383 7818838383 2232 23.000
277 199242 99999 838383 838383 19924838383 2232 2232 2232
236 199244 8099999 838383 41838383 1992838383 6 2232 22 222
d93 2222 222233

目前就是在循环,好像停不下来
  • 写回答

3条回答 默认 最新

  • a5156520 2023-01-15 19:45
    关注

    使用fgets()函数读取一行字符,然后判断最后一个字符是否是‘5’,如果是'5'则把此行以及下面5行都复制到2.txt即可,修改如下:

    参考链接:

    #include <stdio.h>
    #include <string.h>
    int main(void){
        FILE* fp1 = fopen("F:\\1.txt", "r");//只读
        FILE* fp2 = fopen("F:\\2.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))
        {
    //        for (i = 0; i < 35; i++)
    //        {
    //            ch = fgetc(fp1);
    //        }
    //        ch1 = ch;
    //        printf("%c\n", ch1);  //输出行数
    //        x1 = -(ftell(fp1)-x2);//文件指针的偏移量
    //        fseek(fp1, x1, SEEK_CUR);
    //     
    //        if (ch1 =='5')
    //        {
    //         
    //         
    //            for (i = 0; i < 6; i++)
    //            {
    //                fgets(buf1, sizeof(buf1), fp1);
    //                fputs(buf1, fp2);
    //            }
    //            x2 = ftell(fp1);
    //            printf("%d\n", x2);
    //           
    //        }
       // https://baike.baidu.com/item/fgets/10942211?fr=aladdin
           fgets(buf1,1024,fp1); // 读取一行字符到buf1字符数组 
           //printf("buf1=%s\n",buf1);
           //  strlen(buf1) 读取的这行字符的长度,
           // 如果读取到此行结束的换行符,则strlen(buf1)-1 为换行符的位置,strlen(buf1)-2为肉眼可见的最后一个字符 
           if(buf1[strlen(buf1)-2]=='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);    
                }     
           }
       
        }  
        fclose(fp1);
        fclose(fp2);
        fp1 = NULL;
        fp2 = NULL;
        printf("复制数据完毕!\n"); 
        
        return 0;
    } 
    

    1.txt(测试文件内容):

    S SHSH S C 234 123 44 332303 44 5
    102 74744747 99999 838383 838383 91 838383 32232
    102 747442 99999 838383 44838383 7818838383 2232 23.000
    277 199242 99999 838383 838383 19924838383 2232 2232 2232
    236 199244 8099999 838383 41838383 1992838383 6 2232 22 222
    d93 2222 222233
    S SHSH S C 234 123 44 332303 44 5
    102 74744747 99999 838383 838383 91 838383 32232
    102 747442 99999 838383 44838383 7818838383 2232 23.000
    277 199242 99999 838383 838383 19924838383 2232 2232 2232
    236 199244 8099999 838383 41838383 1992838383 6 2232 22 222
    d93 2222 222233
    S SHSH S C 234 123 44 332303 44 6
    102 74744747 99999 838383 838383 91 838383 32232
    102 747442 99999 838383 44838383 7818838383 2232 23.000
    277 199242 99999 838383 838383 19924838383 2232 2232 2232
    236 199244 8099999 838383 41838383 1992838383 6 2232 22 222
    d93 2222 222233
    S SHSH S C 234 123 44 332303 44 5
    102 74744747 99999 838383 838383 91 838383 32232
    102 747442 99999 838383 44838383 7818838383 2232 23.000
    277 199242 99999 838383 838383 19924838383 2232 2232 2232
    236 199244 8099999 838383 41838383 1992838383 6 2232 22 222
    d93 2222 222233
    

    img

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

报告相同问题?

问题事件

  • 系统已结题 1月23日
  • 已采纳回答 1月15日
  • 创建了问题 1月15日

悬赏问题

  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?