C语言文件操作问题,怎样替换文件中一行数据 C语言文件操作中 为什么无法修改中间某一行数据?

\u600e\u4e48\u7528C\u8bed\u8a00\u5bf9\u6587\u4ef6\u64cd\u4f5c\u7528\u7279\u5b9a\u5185\u5bb9\u66ff\u6362\u5176\u4e2d\u67d0\u4e9b\u5185\u5bb9

\u5982\u679c\u53ea\u60f3\u4fee\u6539\u6587\u4ef6\u4e00\u90e8\u5206\u3002
\u53ef\u4ee5\u4f7f\u7528\u51fd\u6570int fseek( FILE *stream, long offset, int origin );\u6765\u5b9a\u4f4d\u4f60\u7684\u6587\u4ef6\u6307\u9488\u3002
\u6587\u4ef6\u6307\u9488\u7684\u4f4d\u7f6e\u51b3\u5b9a\u4f60\u8bfb\u5199\u6587\u4ef6\u7684\u8d77\u59cb\u4f4d\u7f6e\u3002
\u5176\u4e2d\u53c2\u6570origin \uff1a\u8868\u793a\u4ece\u54ea\u91cc\u5f00\u59cb\u504f\u79fb\uff0c\u503c\u6709\uff1a
SEEK_SET\uff1a \u6587\u4ef6\u5f00\u5934
SEEK_CUR\uff1a \u5f53\u524d\u4f4d\u7f6e
SEEK_END\uff1a \u6587\u4ef6\u7ed3\u5c3e
\u53c2\u6570offset\uff1a\u8868\u793a\u504f\u79fb\u7684\u5b57\u8282\u6570\uff0c\u6b63\u6570\u8868\u793a\u6b63\u5411\u504f\u79fb\uff0c\u8d1f\u6570\u8868\u793a\u8d1f\u5411\u504f\u79fb\u3002
\u6bd4\u5982
\u4f60\u5148\u8bfb\u53d6\u6587\u4ef6\u5185\u5bb9\uff0c\u540c\u65f6\u505a\u5224\u65ad\uff0c\u627e\u5230\u4f60\u8981\u6539\u7684\u5185\u5bb9\u65f6\uff0c\u8c03\u7528\u51fd\u6570
fseek(fp,10L,SEEK_CUR);\u628a\u6587\u4ef6\u6307\u9488\u79fb\u52a8\u5230\u79bb\u5f53\u524d\u6307\u9488\u4f4d\u7f6e10\u4e2a\u5b57\u8282\u7684\u5730\u65b9\uff08\u6211\u4eec\u5047\u8bbe\u5f53\u524d\u4f4d\u7f6e\u504f\u79fb10\u4e2a\u5b57\u8282\u5c31\u662f\u4f60\u8981\u4fee\u6539\u7684\u8d77\u59cb\u4f4d\u7f6e\uff09\uff1b
\u8fd9\u6837\u4f60\u4e4b\u540e\u7684\u8bfb\u5199\u90fd\u662f\u4ece\u8fd9\u4e2a\u4f4d\u7f6e\u5f00\u59cb\u3002
\u4e0d\u8fc7\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4f60\u4ece\u8fd9\u4f4d\u7f6e\u5f00\u59cb\u5199\u65b0\u7684\u5185\u5bb9\uff0c\u53ef\u4ee5\u8986\u76d6\u539f\u5185\u5bb9\uff0c\u6240\u4ee5\u5982\u679c\u65b0\u7684\u5185\u5bb9\u6bd4\u4f60\u60f3\u8986\u76d6\u7684\u5185\u5bb9\u957f\u7684\u8bdd\uff0c\u4f1a\u628a\u540e\u9762\u4f60\u60f3\u4fdd\u7559\u7684\u5185\u5bb9\u4e5f\u8986\u76d6\u6389\u3002
\u8fd9\u79cd\u601d\u8def\uff0c\u4f60\u60f3\u8981\u5b9e\u73b0\u4fee\u6539\u6307\u5b9a\u5185\u5bb9\uff0c\u8fd8\u9700\u8981\u628a\u4fee\u6539\u5185\u5bb9\u4e4b\u540e\u7684\u6570\u636e\u4e5f\u8bfb\u51fa\u6765\u5907\u4efd\uff0c\u518d\u4e00\u8d77\u5199\u8fdb\u53bb\u3002
\u6240\u4ee5\u6700\u7b80\u5355\uff0c\u8fd8\u662f\u76f4\u63a5\u751f\u6210\u65b0\u7684\u6587\u4ef6\u66ff\u6362\u539f\u6587\u4ef6\u3002

fgets\u548cgets\u6709\u4e00\u4e2a\u5f88\u5927\u7684\u4e0d\u540c\uff0c\u5c31\u662f\u8bfb\u5b8c\u4e00\u884c\u540e\u5149\u6807\u505c\u7559\u5728\u5f53\u524d\u884c\u7684\u7ed3\u675f\u7b26\u7684\u4f4d\u7f6e\uff0c\u5e76\u4e0d\u4f1a\u81ea\u52a8\u8f6c\u884c\u3002\u4f60\u7684\u95ee\u9898\u5c31\u51fa\u5728\u8fd9\u91cc\u3002\u53ef\u4ee5\u7528\u4e00\u4e2afgetc(fp)\u6765\u8f6c\u884c\u3002\u81f3\u4e8e\u7b2c\u4e8c\u4e2a\u95ee\u9898\uff0c\u6587\u4ef6\u6253\u5f00\u65b9\u5f0f\u4f60\u518d\u4ed4\u7ec6\u770b\u4e00\u4e0b\uff0c\u6211\u8bb0\u4e0d\u5f97\u662f\u201dw+\u201c\u8fd8\u662f\u522b\u7684\u4ec0\u4e48\u4e86\u3002

  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,"
");

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,"
");

    }

    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,"
");

    fclose(fp);


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



#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;
}

  • 濡備綍鐢C璇█鏂囦欢鎿嶄綔淇敼鎸囧畾鏂囦欢
    绛旓細鐢变簬鎿嶄綔绯荤粺瀵鏂囦欢鎿嶄綔鍋氫簡灏佽锛屾湰鏉ュ緢瀹规槗鐨勪簨鎯呭彉寰楀緢闅句簡銆備慨鏀规枃浠舵渶濂界殑锛屾渶绠鍗曠殑鏂规硶锛屾槸鏂板缓涓涓枃浠讹紝鎶婁慨鏀归儴鍒嗗墠闈㈢殑锛屽厛鍐欏叆鏂版枃浠讹紝鐒跺悗鍐欏叆淇敼鐨勯儴鍒嗭紝鍐嶆妸鍚庝竴閮ㄥ垎娌℃湁淇敼鐨勶紝鍐欏埌鏂版枃浠朵腑鍘汇傜劧鍚庢枃浠堕噸鍛藉悕銆傚師鏂囦欢鏀瑰悕澶囦唤鏂囦欢锛屾柊鏂囦欢鏀瑰悕鍘熸枃浠躲傚鏋滀慨鏀圭殑鏁版嵁寰堝皯N~100N KB锛...
  • C璇█涓粈涔堝嚱鏁板彲浠ヤ慨鏀鏂囦欢鍐呭(鍙互闅忔剰鍒犻櫎鍘熷唴瀹圭殑涓閮ㄥ垎...
    绛旓細C璇█鏂囦欢鎿嶄綔璇﹁ВC璇█涓病鏈夎緭鍏ヨ緭鍑鸿鍙,鎵鏈夌殑杈撳叆杈撳嚭鍔熻兘閮界敤 ANSI C鎻愪緵鐨勪竴缁勬爣鍑嗗簱鍑芥暟鏉ュ疄鐜般傛枃浠舵搷浣滄爣鍑嗗簱鍑芥暟鏈: 鏂囦欢鐨勬墦寮鎿嶄綔 fopen 鎵撳紑涓涓枃浠 鏂囦欢鐨勫叧闂搷浣 fclose 鍏抽棴涓涓枃浠 鏂囦欢鐨勮鍐欐搷浣 fgetc 浠庢枃浠朵腑璇诲彇涓涓瓧绗 fputc 鍐欎竴涓瓧绗﹀埌鏂囦欢涓幓 fgets 浠庢枃浠朵腑璇诲彇涓涓瓧绗︿覆 fpu...
  • c璇█鏂囦欢涓瓧绗︿覆鐨勬煡鎵句笌鏇挎崲闂
    绛旓細浣犲ソ锛屼綘鐨勪唬鐮佸凡缁忔敼濂戒簡锛岄棶棰涓嶅ぇ锛岄兘鏄竴浜涚粏鑺傘傚凡缁忕紪璇戣繍琛岀‘璁わ細锛塱nclude<stdio.h> include<conio.h> include<string.h> include<stdlib.h> int Count=0;int findNum(char *str){ int i=0,t1=0;FILE *p;char ch;if((p=fopen("image.gl","rb"))==NULL){ printf("\n鎵撳紑鏂...
  • c璇█鎬庝箞鍒涘缓鏂囦欢,淇敼鏂囦欢鍐呭銆
    绛旓細渚嬶細remove("c:\\io.sys");14.fread()浠庢祦涓鎸囧畾涓暟鐨勫瓧绗︼紝鍘熷瀷鏄痵ize_t fread(void *ptr, size_t size, size_t n, FILE *stream);鍙傛暟ptr鏄繚瀛樿鍙栫殑鏁版嵁锛寁oid*鐨勬寚閽堝彲鐢ㄤ换浣曠被鍨嬬殑鎸囬拡鏉鏇挎崲锛濡俢har*銆乮nt *绛夌瓑鏉ユ浛鎹;size鏄瘡鍧楃殑瀛楄妭鏁;n鏄鍙栫殑鍧楁暟锛屽鏋滄垚鍔燂紝杩斿洖瀹為檯...
  • C璇█鏂囦欢鎿嶄綔闂
    绛旓細浣犲幓璇曡瘯锛屾垜鍦╨inux涓嬭皟璇曢氳繃浜嗐俰nclude <stdio.h> include <string.h> int main( void ){ FILE *fp = NULL;char fpath[128];char str[4];printf("\n璇疯緭鍏鏂囦欢鐨勫畬鏁磋矾寰勫悕鍜屾枃浠跺悕\nfilepath =");scanf("%s",fpath);if((fp = fopen(fpath,"rb+")) == NULL){ printf("\...
  • c璇█濡備綍鍋氬埌鎶婃枃鏈鏂囦欢璇诲彇鎿嶄綔鍚庤鐩栧師鏂囦欢淇濆瓨
    绛旓細鍏堢敤r妯″紡璇诲彇鏂囦欢鍐呭骞朵繚瀛樺湪閫傚綋鐨勬暟缁勪腑锛宖close銆備綘鍙互淇敼鍏朵腑鐨勬暟鎹紝鐒跺悗鐢╳妯″紡璇诲彇鐩稿悓鏂囦欢鍚嶏紝鍐嶅啓鍏ユ暟鎹
  • C璇█ 鍏充簬鏂囦欢鎿嶄綔鐨闂
    绛旓細璇峰皢fp=fopen(filea,"w");鏀规垚fp=fopen(filea,"wb+");鐢变簬鏄敤浜岃繘鍒舵柟寮忎功鍐鏂囦欢鏁版嵁锛屾墍浠ヤ綘鐢ㄦ枃鏈柟寮忓幓鐪嬫椂浼氭湁闂锛濡傛灉鎯冲洖璇绘暟鎹紝1涓槸璁捐绋嬪簭璇诲嚭鍜岀敤printf鎵撳嵃锛2杩樺彲浠ョ敤16杩涘埗缂栬緫鏂囦欢鏉ョ湅鏁版嵁锛屼絾鐪嬪埌鐨勫皢鏄暟鎹岄潪鏂囨湰銆
  • c璇█鐨鏂囦欢鎿嶄綔
    绛旓細鍥涖佹枃浠跺叧闂 瀹屾垚鏂囦欢鎿嶄綔鍚庯紝闇瑕佸叧闂枃浠朵互閲婃斁绯荤粺璧勬簮銆傚彲浠ヤ娇鐢╜fclose`鍑芥暟鏉ュ叧闂枃浠躲傚鏋滃叧闂枃浠跺け璐ワ紝鍙兘浼氬鑷存暟鎹涪澶辨垨鍏朵粬闂銆C璇█鐨勬枃浠舵搷浣滀富瑕佸洿缁曟枃浠舵寚閽堝睍寮銆傞氳繃鏂囦欢鎸囬拡锛屾垜浠彲浠ュ鏂囦欢杩涜鍚勭鎿嶄綔銆傚湪鎵撳紑鏂囦欢鏃讹紝鎴戜滑闇瑕佹寚瀹氭枃浠剁殑璺緞鍜屾墦寮鏂瑰紡锛屼互渚跨▼搴忚兘澶熸纭湴璇诲彇鎴栧啓鍏...
  • c璇█鐨鏂囦欢淇敼,鍒犻櫎闂
    绛旓細淇敼鏂囦欢涓寚瀹氬唴瀹圭殑鎬濊矾鏄紝1銆乫open鎵撳紑鏂囦欢锛璇诲彇涓琛屾垨涓瀹氬瓧鑺傛暟鏂囦欢鍐呭鍒拌繘绋嬪唴瀛樼┖闂淬傝嫢鏂囦欢璇诲彇鍒癊OF缁撴潫绗︼紝璺宠嚦绗4姝ワ紱鑻ユ枃浠舵湭璇诲彇瀹屾瘯锛屾墽琛岀2姝ャ2銆佸湪杩涚▼鍐呭瓨绌洪棿锛堜篃灏辨槸瀛楃涓插彉閲忥級閲岄潰淇敼浣犳兂鏀瑰姩鐨勫唴瀹广3銆佸皢鏀瑰姩鍚庣殑鍐呭鍐欏叆鍙︿竴涓柊寤虹殑鏂囦欢淇濆瓨銆4銆佸垹闄ゅ師鏂囦欢锛屽皢鏂板缓...
  • 濡備綍鐢C璇█鏂囦欢鎿嶄綔淇敼鎸囧畾鏂囦欢
    绛旓細鐢变簬鎿嶄綔绯荤粺瀵鏂囦欢鎿嶄綔鍋氫簡灏佽锛屾湰鏉ュ緢瀹规槗鐨勪簨鎯呭彉寰楀緢闅句簡銆備慨鏀规枃浠舵渶濂界殑锛屾渶绠鍗曠殑鏂规硶锛屾槸鏂板缓涓涓枃浠讹紝鎶婁慨鏀归儴鍒嗗墠闈㈢殑锛屽厛鍐欏叆鏂版枃浠讹紝鐒跺悗鍐欏叆淇敼鐨勯儴鍒嗭紝鍐嶆妸鍚庝竴閮ㄥ垎娌℃湁淇敼鐨勶紝鍐欏埌鏂版枃浠朵腑鍘汇傜劧鍚庢枃浠堕噸鍛藉悕銆傚師鏂囦欢鏀瑰悕澶囦唤鏂囦欢锛屾柊鏂囦欢鏀瑰悕鍘熸枃浠躲傚鏋滀慨鏀圭殑鏁版嵁寰堝皯N~100N KB锛...
  • 扩展阅读:扫一扫题目出答案 ... c编译的四个过程 ... c++常用头文件大全 ... c语言头文件一般能放什么 ... c++编程可以自学吗 ... c++简单程序实例 ... 如何自己编写头文件并调用 ... c++必背入门代码 ... c语言如何编辑头文件例子 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网