本文是关于库<stdio.h>中操作文件方法的学习记录。

问题一:文件的连接

这个问题很简单,只要用能读写的函数就可以了,fgetc、fgets、fwrite、fprintf都可以满足要求。我用的fgetc,以文件实训的代码为例连接filename1、filename2 和 filename3 三个文件的内容到 filename 文件中:

#include&lt;stdio.h&gt;
void connect(char *filename,char *filename1,char *filename2,char *filename3)
{
    char c;
    FILE *fp1,*fp2,*fp3,*fpnew;
    fp1=fopen(filename1,&quot;rt+&quot;);
    fpnew=fopen(filename,&quot;at+&quot;);
    while((c=fgetc(fp1))!= EOF)
    fputc(c, fpnew);
    fclose(fp1);
    fputc(&#039;\n&#039;,fpnew);
    fp2=fopen(filename2,&quot;rt+&quot;);
    while((c=fgetc(fp2))!= EOF)
    fputc(c, fpnew);
    fclose(fp2);
    fputc(&#039;\n&#039;,fpnew);

    fp3=fopen(filename3,&quot;rt+&quot;);
    while((c=fgetc(fp3))!= EOF)
    fputc(c, fpnew);
    fclose(fp3);
    fclose(fpnew);
}
int main()
{
    char buf[1024];
    char *file1=&quot;src/step2_1/test1.c&quot;;   // 源文件1
    char *file2=&quot;src/step2_1/test2.c&quot;;   // 源文件2
    char *file3=&quot;src/step2_1/test3.c&quot;;   // 源文件3
    char *file=&quot;src/step2_1/test.c&quot;;     // 目标文件
    FILE *fp;                            // 目标文件的指针
    connect(file,file1,file2,file3);    // 将源文件file1、file2和file3的内容连接到目标文件file中
    fp=fopen(&quot;src/step2_1/test.c&quot;,&quot;r&quot;);
    while(fgets(buf,sizeof(buf),fp)!=NULL)   //读取目标文件
    {
        printf(&quot;%s&quot;,buf);
    }
    fclose(fp);
    fp=fopen(&quot;src/step2_1/test.c&quot;,&quot;w&quot;);
    fclose(fp);
    return 0; 
}

问题二:文本文件的字符串替换

字符串替换看似简单,实则有一定难度,若使用字符数组,若替换的字符串不等长还会涉及到前移后移的问题,若使用链表则整个代码难度就会大很多。我采取的是把每行分成三个字符数组,使用strstr函数返回第一个需要替换的字符串首元素指针,之前的字符为第一组,该待替换字符串为一组,该字符串后为一组,只取出前后两段,按顺序写入文件这两段跟替换后新的字符串即可。代码如图,替换passage.txt内的字符串you为they:

#include&lt;stdio.h&gt;
#include&lt;string.h&gt;
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(&quot;%s%s%s%s&quot;,order,filename,former,replace);
leng1=strlen(former),leng2=strlen(replace);
if(strcmp(order,&quot;replace&quot;)!=0)printf(&quot;Error\n&quot;);
else {
while(k&lt;10){
//克服strstr只返回每行第一个字串的问题,反复替换
fp0=fopen(filename,&quot;r+&quot;);
fp1=fopen(&quot;newfile.txt&quot;,&quot;w&quot;);
         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&lt;begin;i++)
 str1[i]=str[i];
 len1=strlen(str1);
 for(i=len1+leng1,j=0;str[i]!=&#039;\0&#039;;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(&quot;newfile.txt&quot;,&quot;passage.txt&quot;);
   k++;
   //删除原文件而新建一个写入并重命名,避免文件指针的复杂操作
}}
}
/*
replace passage.txt you they
replace passage.txt they you
此处为命令行指令*/

华科菜鸡计科学生