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;
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
使用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
望采纳!!!点击回答右侧采纳即可!!
可能是因为你的循环条件有问题,你的循环条件是while(ch1=='5'),但是你在循环体中没有改变ch1的值,所以会一直循环下去。你可以在循环体中改变ch1的值,比如ch1=fgetc(fp1),这样就可以跳出循环了。