兩種方法修改區域性資料
//已在記憶體中修改過單行資料後直接呼叫該函式
void
rebuildfile
(list a)
//list為結構體指標,指標a指向已修改部分鍊錶
fclose
(p1)
;fclose
(p2)
;remove
("...\\date.txt");
//刪除date.txt檔案
rename
("...\\date2.txt"
,"...\\date.txt");
//將date2.txt重新命名為date.txt
}
但資料量很大時,單行改動就要重寫整個檔案,浪費很多計算資源。
流程:得到待修改的資料在檔案中的位置
將檔案內部指標定位到該位置
寫入新資料到檔案
file* p =
fopen
("...\\date.txt"
,"r+");
long position;
//後面用到
char name1[10]
;printf
("輸入需要修改的姓名:"
);scanf
("%s"
,name1)
;while
(fscanf
(p,"%d%s%lf"
,&num1, name1,
&source)==3
)
用於讀取的檔案指標無法用於寫入
用long ftell( file *stream );
函式讀取指標位置(相對檔案首偏移位元組數)
//接上
position =
ftell
(p);
position -
=//待修改資料長度; 即定位到待修改資料前
int origin
說明seek_set(0)
從檔案的開始處開始
seek_cur(1)
從當前位置開始
seek_end(2)
從檔案的結束處開始
fessk從orign處開始,向後偏移offset個位元組數,offset < 0 即向前移動
fseek
(p,position,1)
;//從當前位置開始
直接用fprintf
寫入即可,會覆蓋原檔案,需考慮新資料長度小於原資料長度時,用空格覆蓋。 C語言 全域性?靜態全域性?區域性?靜態區域性
全域性變數 儲存在靜態區,程式執行的整個過程一直占用記憶體。所有檔案所有函式都可以使用 使用extern宣告 比較靈活。正是因為多個地方都可讀可寫,是乙個很危險的事,因為不知道某個時刻誰會將它改變,而且導致程式不方便移植。適當使用全域性變數還是有很多好處的,只是不推薦濫用全域性變數 區域性變數 除了...
C語言 函式內區域性陣列
直接看這個例子 void test 對於上面的test函式,如果連續呼叫兩次,會得到什麼樣的輸出 答案是 abcabc abc這是我實際測出的值,我當時很迷惑,為什麼b是區域性陣列,當函式結束時這部分記憶體就被釋放了,而第二次呼叫test時,b陣列的值仍然是abc.可能有人說區域性陣列是存放在靜態儲...
C語言 返回區域性變數
一般的來說,函式是可以返回區域性變數的。區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被...