c語言檔案操作問題,怎樣替換檔案中一行資料

2021-12-27 18:27:17 字數 4576 閱讀 6524

1樓:匿名使用者

通過使用下面的幾個函式,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;

。。。。/*完成對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;

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

cstring str;

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

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

下面是修改後的資料,修改第二行,沒有影響前後的資料。

2樓:匿名使用者

#include

#include

#define n 512 //一行中最大字元數int main()

//生成新檔名並開啟臨時新檔案

tmpname = tmpnam(tmpname);

fpnew = fopen(tmpname, "w");

if (fpnew == null)

//第一行

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語言對檔案操作用特定內容替換其中某些內容

3樓:

由於作業系統對檔案操作做了封裝,本來很容易的事情變得很難了。

修改檔案最好的,最簡單的方法,是新建一個檔案,把修改部分前面的,先寫入新檔案,

然後寫入修改的部分,再把後一部分沒有修改的,寫到新檔案中去。然後檔案重新命名。

原檔案改名備份檔案,新檔案改名原檔案。

如果修改的資料很少n~100n kb,n~10n mb 可以用緩衝區處理好修改,再寫入檔案。

file×

fopen

fseek

fwrite

fclose

ps:1)如果修改的內容,和原檔案被修改的資料,位元組數完全相同,直接找到要修改的地方,寫入新內容就可以了。

2)如果修改後的內容,和原檔案被修改的資料,位元組數不同,建議新建一個檔案,否則很麻煩,要用讀寫方式開啟。

a) 如果修改後資料增加,把修改資料後的所有資料向後移動,給修改的資料騰地方。

b) 如果減少,要把所有資料前移,然後修改檔案長度。

4樓:自我程式設計

如果只想修改檔案一部分。

可以使用函式int fseek( file *stream, long offset, int origin );來定位你的檔案指標。

檔案指標的位置決定你讀寫檔案的起始位置。

其中引數origin :表示從**開始偏移,值有:

seek_set: 檔案開頭

seek_cur: 當前位置

seek_end: 檔案結尾

引數offset:表示偏移的位元組數,正數表示正向偏移,負數表示負向偏移。

比如你先讀取檔案內容,同時做判斷,找到你要改的內容時,呼叫函式

fseek(fp,10l,seek_cur);把檔案指標移動到離當前指標位置10個位元組的地方(我們假設當前位置偏移10個位元組就是你要修改的起始位置);

這樣你之後的讀寫都是從這個位置開始。

不過要注意的是,你從這位置開始寫新的內容,可以覆蓋原內容,所以如果新的內容比你想覆蓋的內容長的話,會把後面你想保留的內容也覆蓋掉。

這種思路,你想要實現修改指定內容,還需要把修改內容之後的資料也讀出來備份,再一起寫進去。

所以最簡單,還是直接生成新的檔案替換原檔案。

5樓:匿名使用者

讀入檔案到緩衝區,修改緩衝區內容,然後將緩衝區的內容重新寫入到檔案

關於c語言中檔案修改的操作!

6樓:樂跑小子

使用檔案操作函式fopen即可建立檔案,使用檔案操作函式fprintf即可修改檔案內容。

1、c語言標準庫提供了一系列檔案操作函式。檔案操作函式一般以f+單詞的形式來命名(f是file的簡寫),其宣告位於stdio.h標頭檔案當中。

例如:fopen、fclose函式用於檔案開啟與關閉;fscanf、fgets函式用於檔案讀取;fprintf、fputs函式用於檔案寫入;ftell、fseek函式用於檔案操作位置的獲取與設定。

2、例程:

#include

int i,a[100];

int main()

for(i=0;fscanf(fp1,"%d",a+i)!=eof;i++);//從輸入檔案連續讀取整數到陣列a

for(;i--;)fscanf(fp2,"%d ",a[i]);//把陣列a逆序寫入到輸出檔案當中

fclose(fp1);//關閉輸入檔案

fclose(fp2);//關閉輸出檔案,相當於儲存

return 0;}

7樓:厚如雲

#include

#include

using namespace std;

class book

;//book類的定義

void book::input()

void book::modifynum()void book::show()

void main()

8樓:

沒什麼思路,好像是隻能不追加,重寫一遍!

9樓:匿名使用者

使用r+開啟,具有寫許可權,原來的資料還在,寫入時才會覆蓋,沒覆蓋的也不變

如果用w,w+等,都會銷燬原來的資料,從新寫入比如已有檔案中資料abcde

用r+開啟在開頭寫入字母z之後,檔案內容變為zbcde如果帶w的方式,就只剩z了

C語言的檔案訪問,C語言檔案操作

先定義乙個檔案指標 file fp 然後給它賦值 fp fopen 要訪問的檔名,r 然後就可以從檔案中讀取資料了。其中檔名要以字串的形式出現,比如我要開啟c盤根目錄下的,就要寫成。fp fopen c 路徑中的所有的 都要用轉義字元 替換掉,否則的話c的編譯器會把 後面的乙個字元當成轉義字元的引數...

c 程式設計檔案操作問題

c 程式設計問題 檔案的相關操作 20 標籤 c 程式設計,c 檔案 2 編寫乙個程式,實現以下功能 1 輸入一系列的資料 學號 姓名 成績 存放在檔案stud.dat中 2 從該檔案中讀出這些資料並顯示出來。2 實驗目的和要求 1 掌握磁碟檔案的操作 2 使用write函式完成將記憶體中的一塊東西...

WIN7怎麼替換資料夾

說明目標路徑下已經有了一個 新建資料夾 了,點 是 的話就會覆蓋目標新建資料夾,否 就取消複製了 如果2個資料夾裡面的檔案都不是一樣的話,就點 是 這樣2個資料夾就會合併成1個資料夾了 裡面含有2個資料夾裡的所有檔案 如果2個資料夾還有相同檔案的話,如果直接點 是 會出現舊檔案覆蓋新檔案的情況,所以...