本文是关于库<stdio.h>中操作文件方法的学习记录。
问题一:文件的连接
这个问题很简单,只要用能读写的函数就可以了,fgetc、fgets、fwrite、fprintf都可以满足要求。我用的fgetc,以文件实训的代码为例连接filename1、filename2 和 filename3 三个文件的内容到 filename 文件中:
#include<stdio.h>
void connect(char *filename,char *filename1,char *filename2,char *filename3)
{
char c;
FILE *fp1,*fp2,*fp3,*fpnew;
fp1=fopen(filename1,"rt+");
fpnew=fopen(filename,"at+");
while((c=fgetc(fp1))!= EOF)
fputc(c, fpnew);
fclose(fp1);
fputc('\n',fpnew);
fp2=fopen(filename2,"rt+");
while((c=fgetc(fp2))!= EOF)
fputc(c, fpnew);
fclose(fp2);
fputc('\n',fpnew);
fp3=fopen(filename3,"rt+");
while((c=fgetc(fp3))!= EOF)
fputc(c, fpnew);
fclose(fp3);
fclose(fpnew);
}
int main()
{
char buf[1024];
char *file1="src/step2_1/test1.c"; // 源文件1
char *file2="src/step2_1/test2.c"; // 源文件2
char *file3="src/step2_1/test3.c"; // 源文件3
char *file="src/step2_1/test.c"; // 目标文件
FILE *fp; // 目标文件的指针
connect(file,file1,file2,file3); // 将源文件file1、file2和file3的内容连接到目标文件file中
fp=fopen("src/step2_1/test.c","r");
while(fgets(buf,sizeof(buf),fp)!=NULL) //读取目标文件
{
printf("%s",buf);
}
fclose(fp);
fp=fopen("src/step2_1/test.c","w");
fclose(fp);
return 0;
}
问题二:文本文件的字符串替换
字符串替换看似简单,实则有一定难度,若使用字符数组,若替换的字符串不等长还会涉及到前移后移的问题,若使用链表则整个代码难度就会大很多。我采取的是把每行分成三个字符数组,使用strstr函数返回第一个需要替换的字符串首元素指针,之前的字符为第一组,该待替换字符串为一组,该字符串后为一组,只取出前后两段,按顺序写入文件这两段跟替换后新的字符串即可。代码如图,替换passage.txt内的字符串you为they:
#include<stdio.h>
#include<string.h>
char order[10],filename[20],former[20],replace[20];
char str[1000],str1[500],str2[500];
int leng1,leng2,leng0,len1,len2,i,j,k,begin;
char*start=NULL,*st=NULL;
FILE *fp0,*fp1;
void initialize(char*a,char*b,char*c){
memset(a,0x00,sizeof(char)*1000);
memset(b,0x00,sizeof(char)*500);
memset(c,0x00,sizeof(char)*500);}//初始化函数
void main(){
scanf("%s%s%s%s",order,filename,former,replace);
leng1=strlen(former),leng2=strlen(replace);
if(strcmp(order,"replace")!=0)printf("Error\n");
else {
while(k<10){
//克服strstr只返回每行第一个字串的问题,反复替换
fp0=fopen(filename,"r+");
fp1=fopen("newfile.txt","w");
while(!feof(fp0)){
fgets(str,1000,fp0);
leng0=strlen(str);
start=strstr(str,former);
if(start){
for(i=0;st!=start;i++)
st=str+i;
begin=i-1;
for(i=0;i<begin;i++)
str1[i]=str[i];
len1=strlen(str1);
for(i=len1+leng1,j=0;str[i]!='\0';i++,j++)
str2[j]=str[i];
len2=strlen(str2);
fwrite(str1,sizeof(char),len1,fp1);
fputs(replace,fp1);
fwrite(str2,sizeof(char),len2,fp1);
fflush(fp1);//拆分成三段输出
initialize(str,str1,str2);}
else fputs(str,fp1);//无可替换字串直接输出
}
fclose(fp0);
remove(filename);
fclose(fp1);
rename("newfile.txt","passage.txt");
k++;
//删除原文件而新建一个写入并重命名,避免文件指针的复杂操作
}}
}
/*
replace passage.txt you they
replace passage.txt they you
此处为命令行指令*/