動態分配記憶體:
前一天的筆記裡記錄了申請動態記憶體的一種方法,通過malloc(int);函式。
今天再介紹兩種申請分配動態記憶體的方法。
1、calloc(int,int);
calloc(10,sizeof(int));
calloc函式也可以動態申請記憶體。上述例子中表示,申請10個int型別所佔位元組大小的記憶體空間,所以一共是需要40byte。
除了引數不同,通過這函式申請的記憶體空間,會被全部初始化成0.
2、realloc();
這個函式的作用是對已經動態分配好的記憶體進行調整。
如果用這個函式去對乙個動態分配好的10byte記憶體進行擴充至20byte,擴充的10byte記憶體空間是連續在之前申請好的那塊10byte記憶體的後面。假設原先申請好的動態記憶體空間之後的空間已經被使用,那麼這個函式會在記憶體裡找一塊連續的20byte空間,然後把原先10byte的記憶體中的資料拷貝過來,再銷毀原先的10byte空間。
這樣的做法是比較消耗資源的,所以盡量不要使用這個函式。
檔案
c語言中將檔案看作兩種,一種是文字檔案,一種是二進位制檔案。
所以對文字的操作也分為兩種:
1、第一種是通過二進位制方式來讀寫檔案,由於文字檔案也可以看作是二進位制的檔案,所以這種方法,也可以對二進位制檔案操作。
2、第二種是通過文字方式來讀寫檔案,只能讀寫文字檔案。
操作檔案的函式:
fopen();
用於開啟乙個檔案。有兩個引數,第乙個引數表示了檔案的位置,第二個引數表示了檔案的開啟方式。
該函式呼叫結束後,會返回乙個檔案指標型別(file*)的返回值。
檔案位置的表示方式可以採用絕對路徑,也可以採用相對路徑。
檔案開啟方式分為以下幾種:
「w」:只能對檔案進行寫入,不能讀取。如果路徑上檔案不存在,將會建立乙個該路徑上的檔案。如果路徑上的檔案存在,它會清空檔案內原來的內容。
「w+」:比上述方式多了可讀取的操作。
「r」:只能對檔案讀取,不能寫入。如果路徑上的檔案不存在,將會返回乙個null。如果存在將會從檔案的開頭開始讀取。
「r+」:比上述方式,多了可寫入的操作。
「a」:只能對檔案寫入。如果路徑上的檔案不存在,則會建立乙個檔案。如果存在,也不會清空它原先的內容,而是會在原先的內容後繼續追加寫入。
「a+」:比上述方式,多了讀取的操作。
「b」:二進位制形式。這個選項可以和上述任意乙個選項一起使用,表示用二進位制的方式開啟檔案。如果不加,就是以文字形式開啟檔案。
fclose
fclose(file);
用fopen函式開啟乙個檔案,對檔案的操作結束之後一定要關閉檔案。因為開啟檔案的時候fopen的內部實現會為這次操作申請動態記憶體,如果不用fclose關閉的話,會造成記憶體洩漏。
該函式只有乙個引數,就是fopen函式返回的檔案指標。
fwrite
fwrite(,int,int,file*)
fwrite(num,sizeof(int),10,p_file);
對檔案執行寫入操作的函式。
這個函式有四個引數:
第乙個引數,是乙個記憶體位址,表示寫入檔案的內容在記憶體空間的首位元組位址。
第二個引數,是乙個整型引數,表示這次寫入檔案的單位。
第三個引數,是乙個整型引數,表示要連續寫入多少個單位的內容
第四個引數,是檔案指標,表示寫入哪個檔案。
fread
fread(num,sizeof(int),10,p_file);
對檔案執行讀取操作的函式。
函式也有4個引數,很fwrite一致
下面通過乙個例子來演示上述函式,**如下:
#include
#include
#include
typedef
structpeople;
int main(int argc,char** argv);
people one = ;
int size = 0;
file* p_wfile = fopen("people.txt","ab");
file* p_rfile = fopen("people.txt","rb");
if(p_wfile)
fclose(p_wfile);
p_wfile = null;
}if(p_rfile)
fclose(p_rfile);
p_rfile = null;
}return
0;}
上述**,建立了乙個結構體,向檔案寫入乙個結構體型別,然後再讀取出來。用的都是二進位制方式來操作的。
在二進位制方式下讀寫檔案,是要按照讀寫內容本身的型別來做的,因為每個型別的位元組數不同,一旦寫入和讀取用的型別不同時,讀取出來的檔案是不能用的。
下面再介紹兩個函式,是用於文字檔案讀寫的。
fprintf&fscanf
fprintf(file*,」佔位符」,);
這個函式和printf函式是很像的,只比它多乙個引數,用於指明把內容寫入到哪個檔案。
fscanf(file*,」佔位符」,);
這個函式和scanf函式很像,多餘的引數是用來表示從哪個檔案裡讀取資料的。
下面用一段**演示一下:
#include
#include
#include
int main(int argc,char** argv);
int number = 0;
file* p_file = fopen("wenben.txt","w");
file* p_rfile = fopen("wenben.txt","r");
if(p_file)
fclose(p_file);
p_file = null;
if(p_rfile)
} return
0;}
將乙個整型陣列通過文字寫入的方式寫入到文字檔案。
再用文字的方式讀取出來。
位置指標
當開啟乙個檔案的時候,計算機會為它用乙個整數型別的值來記錄下一次讀寫開始的位置。叫做位置指標。
位置指標,一定是在兩個位元組中間。
每當向檔案獲取n個位元組或者寫入n個位元組的時候,位置指標都會向後移動n。
ftell&rewind&fseek
test.txt
abcdefghijklmn
------------------------
#include
int main(int argc,char** argv)
------------------------ab
adml
在測試檔案中放置了一串英文本元,通過用函式調整當前位置指標的位置,會列印出預期中的字元。 Python學習筆記 Day16
今日大綱 一 物件導向的組合 組合 給乙個類的物件封裝乙個屬性,這個屬性就是另乙個類的物件 組合的意義 讓乙個類的物件和另乙個類的物件產生關係,讓乙個類和另乙個類產生關係 如何組合 1 在類1中定義乙個方法,類1的物件1在執行這個方法的時候能增加乙個屬性,屬性值就是類2的物件2 2 物件1執行這個方...
力扣學習筆記day16
請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點。傳入函式的唯一引數為 要被刪除的節點 現有乙個鍊錶 head 4,5,1,9 它可以表示為 輸入 head 4,5,1,9 node 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4...
day16 學習總結
今天學習了可變引數和遞迴。老師還留了一道練習題,寫乙個計算器出來,嘗試琢磨了許久,還是沒有做出來。這也是我基礎薄弱的緣故,明天繼續研究。加油加油!下面是知識點 package com.liangwenwei.方法 public class 可變引數 public void test int x,in...