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日