C语言文件操作问题,怎样替换文件中一行数据

例如:一个txt文件ihaveadream;iwanttobeabird;that‘sall;把第二行换成:goodmorning;给我代码谢谢!!!... 例如:一个txt文件
i have a dream;
i want to be a bird;
that‘s all;

把第二行换成: good morning;

给我代码 谢谢!!!
展开
 我来答
匿名用户
推荐于2016-07-21
展开全部

  C语言提供了文件操作,但是替换文件的某一行比较麻烦,下面一个参考方法,文件中存贮的内容如下所示:

  通过使用下面的几个函数,fopen,fprintf,fscanf,fseek,ftell 。具体的函数函数原型如下所示:

  FILE*fopen(const char*filename,const char *mode);

  int fprintf(FILE*stream,const char *format,...)

  int fscanf(FILE* stream,const char *format,...)

  int fseek(FILE*stream,long offset,int origin)

  long ftell(FILE* stream)

  首先,数据写入到文件中的是追加的形式。具体的写入代码如下所示:

  主要写入时要指定每个数据的宽度,若不指定,当修改某行的数据,修改后的长度大于修改前得长度,将影响文件中的下一行。制定宽度之后,只要修改后的长度不大于制定的宽度,都不影响下面的内容。(这是注意点)

FILE *fp=fopen("clientinfo.txt","ar+");

Clientinfo info;

memset(&info,0,sizeof(Clientinfo));

。。。。

。。。。/*完成对info结构体的赋值*/

fprintf(fp,"%10s %10s %10d %10s %10s %10s %10d %10d",info.id,info.nickname,\

info.online,info.pwd,info.encryp,info.ip,info.port,info.fd);

fprintf(fp,"\n");

fclose(fp);

修改处的代码如下所示,整个代码是在MFC中实现的:

FILE *fp=fopen("clientinfo.txt","r+");

Clientinfo info;

long nline=0,n;

memset(&info,0,sizeof(Clientinfo));

int oldline=0;/*记录匹配位置的前一行的偏移量*/

CString str;

while((n=fscanf(fp,"%s %s %d %s %s %s %d %d",info.id,info.nickname,\

&info.online,info.pwd,info.encryp,info.ip,&info.port,&info.fd))!=EOF)

{

      str.Format("%d",nline);

      MessageBox(str);

      if(strncmp(info.id,id,id.GetLength())==0)/*查找要修改的位置*/

      {

oldline=nline;

 break;

      }

      nline=ftell(fp);

}


fseek(fp,oldline,SEEK_SET);/*定位到要修改的位置,注意,这个位置是上一次读的最后,故写的时候要先写换行,第一行除外*/

    if(oldline!=0)

    {

     fprintf(fp,"\n");

    }

    fprintf(fp,"%10s %10s %10d %10s %10s %10s %10d %10d",info.id,info.nickname,\

        info.online,info.pwd,info.encryp,info.ip,info.port,info.fd);

    fprintf(fp,"\n");

    fclose(fp);


下面是修改后的数据,修改第二行,没有影响前后的数据。  

caoyanchuang
推荐于2017-12-15 · TA获得超过486个赞
知道小有建树答主
回答量:115
采纳率:0%
帮助的人:107万
展开全部
#include <stdio.h>
#include <stdlib.h>

#define N 512 //一行中最大字符数

int main()
{
char filename[] = "test.txt"; //原文件名
char* tmpname = NULL; //临时新文件名
FILE* fpOri = NULL; //指向原文件
FILE* fpNew = NULL; //指向新文件
char buf[N];

//打开原文件
fpOri = fopen(filename, "r");
if (fpOri == NULL) {
printf("Error: Cannot open original file!\n");
exit(1);
}

//生成新文件名并打开临时新文件
tmpname = tmpnam(tmpname);
fpNew = fopen(tmpname, "w");
if (fpNew == NULL) {
printf("Error: Cannot open tmp file!\n");
exit(1);
}

//第一行
fgets(buf, N, fpOri);
fputs(buf, fpNew);
//第二行
fgets(buf, N, fpOri);
fprintf(fpNew, "good morning;\n");
//第三行
fgets(buf, N, fpOri);
fputs(buf, fpNew);

//关闭文件
fclose(fpOri);
fclose(fpNew);

remove(filename); //删除原文件
rename(tmpname, filename); //重命名新文件

return 0;
}
更多追问追答
追问
谢谢啊 !!但是目标文件是cpp文件,想把其中的所有scanf和printf都换成fscanf  fprintf即把从键盘获取换成从文件中提取,要怎么做才能有效率的实现呢??
追答
用编辑器查找替换。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式