這個其實很好理解
創(chuàng)新互聯(lián)是一家專注于網(wǎng)站制作、成都網(wǎng)站設(shè)計與策劃設(shè)計,荊門網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:荊門等地區(qū)。荊門做網(wǎng)站價格咨詢:18982081108
只需要把%s,%c,%p放在一起看
首先%s是最常見的很好理解,就是告訴程序后面的變量是一個字符串,在C語言中也就是字符數(shù)組,類型是char*或者char[],換句話說,你告訴程序我會給你一個指針,你去讀這個指針指向的值。
然后%c是告訴程序后面的變量是個字符,類型是char,差別已經(jīng)很明顯了,這時候你告訴程序我給你提供一個字符,你給我在%c處打印出來。然而你給的卻是一個指針,那程序就直接把你給的指針指向的地址本身當(dāng)成字符打印出來了。但是一個地址肯定不止一個字節(jié),也就是說超過了char應(yīng)該有的大小,這時候程序會直接忽略了超出大小的部分,只讀第一個字節(jié)。
如果你同時使用%p,告訴程序,你會提供一個指針,直接把這個指針指向的地址給我打印出來。把輸出的地址最后兩位的16進(jìn)制數(shù)查ascii表,換算成字符,你會發(fā)現(xiàn),剛好就是前面%c打印出的字符。
/*
函數(shù)指針,關(guān)鍵是后面兩個字“指針”,顧名思義,是一個指向函數(shù)的指針
原理:函數(shù)在創(chuàng)建好了后,函數(shù)的代碼會在內(nèi)存中占有個位置,這時我們創(chuàng)造一個指針來指向這個地址,這個指針就叫函數(shù)指針
函數(shù)指針不可以移動,想要移動指針的位置來指向函數(shù)的下一個指令的想法是錯誤的
函數(shù)指針的要求,
1,首先這個指針,要和函數(shù)的返回類型一樣
2,指針的*和名字,要用小括號括起來//不括起來就是指針函數(shù)了,意思就變成,函數(shù)返回一個指針了
3,最右邊的小括號里形參位置的類型,形參的個數(shù),也要和函數(shù)定義時的形參一致,只要類型,不要形參名即可,
但是加上形參名也可以,沒毛病,看上去也更清晰
*/
#include
void swapchar(char *a, char *b)
{
char t;
t = *a;
*a = *b;
*b = t;
}
void swapchar2(char * a2, char * b2)
{
printf("this is swapchar2");
}
int main(void)
{
char chf = 'a', chg = 'j';
void(*p)(char * a, char * b);//定義函數(shù)指針、形參名字a、b可有可無,但有的話看上去更清晰,只要函數(shù)定義的類型、參數(shù)類型、以及參數(shù)個數(shù),與這個指針一致,那么這個指針p,就可以指向它
p = swapchar;//p指針接管swapchar函數(shù),只要給函數(shù)名字,就可以給過去了
printf("chf=%c,chg=%c ", chf, chg);
p(chf, chg);
printf("chf=%c,chg=%c ", chf, chg);
p = swapchar2;//這里把swapchar2函數(shù)的地址,給了p,這時p從swapchar地址,轉(zhuǎn)移到了swapchar2這里。
p(chf,chg);
return 0;
}
"r".為讀而打開文本文件.(不存在則出錯)
"rb".為讀而打開二進(jìn)制文件
while(!feof(fp))
文件到尾判斷
最常用的文件使用方式及其含義如下:
"r".為讀而打開文本文件.(不存在則出錯)
"rb".為讀而打開二進(jìn)制文件.
"w".為寫而打開文本文件.(若不存在則新建,反之,則從文件起始位置寫,原內(nèi)容將被覆蓋)
"wb".為寫而打開二進(jìn)制文件.
"a".為在文件后面添加數(shù)據(jù)而打開文本文件.(若不存在,則新建;反之,在原文件后追加)
"ab".為在文件后面添加數(shù)據(jù)而打開一個二進(jìn)制文件.
"r+".為讀和寫而打開文本文件.(讀時,從頭開始;在寫數(shù)據(jù)時,新數(shù)據(jù)只覆蓋所占的空間,其后不變)
"rb+".為讀和寫而打開二進(jìn)制文件.只是在隨后的讀寫時,可以由位置函數(shù)設(shè)置讀和寫的起始位置.
"w+".首先建立一個新文件,進(jìn)行寫操作,隨后可以從頭開始讀.(若文件存在,原內(nèi)容將全部消失)
"wb+".功能與"w+"同.只是在隨后的讀寫時,可以由位置函數(shù)設(shè)置讀和寫的起始位置.
"a+".功能與"a"相同;只是在文件尾部添加新的數(shù)據(jù)后,可以從頭開始讀.
"ab+".功能與"a+"相同;只是在文件尾部添加新數(shù)據(jù)之后,可以由位置函數(shù)設(shè)置開始讀的起始位置.
你的里面是有語法錯誤的
對你fwtite函數(shù)的使用沒有正確使用
這個不是靠for循環(huán)實現(xiàn)多次讀入的
具體的用法:
int fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
fwrite()函數(shù)從數(shù)組buffer(緩沖區(qū))中, 寫count個大小為size(大小)的對象到stream(流)指定的流. 返回值是已寫的對象的數(shù)量.
然后你的里面還是應(yīng)用了for循環(huán)
#include "stdio.h"
struct student_type
{
char name[10];
int num;
int age;
char addr[15];
}stud[2];
void save()
{
FILE *p;
int num;
if((p=fopen("FILE.txt","wb"))==NULL)
{
printf("open error\n");
return;
}
//int fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
//fwrite()函數(shù)從數(shù)組buffer(緩沖區(qū))中, 寫count個大小為size(大小)的對象到stream(流)指定的流. 返回值是已寫的對象的數(shù)量.
/*
for(i=0;i2;i++)
if ( fwrite(stud[i],sizeof(struct student_type),1,p)!=1)
printf("data error\n");
*/
num = fwrite(stud, sizeof(struct student_type), 2, p);
fclose(p);
}
void main()
{
int i;
printf("請輸入數(shù)據(jù):\n");
for(i=0;i2;i++)
{
scanf("%s",stud[i].name);
scanf("%d",stud[i].num);
scanf("%d",stud[i].age);
scanf("%s",stud[i].addr);
}
save();
struct student_type stud1[2];
FILE *fp;
fp=fopen("FILE.txt","rb");
fread(stud1,sizeof(struct student_type),2,fp);
for (i = 0; i 2; i++)
{
printf("%s\t",stud1[i].name);
printf("%d\t",stud1[i].age);
printf("%d\t",stud1[i].num);
printf("%s\t",stud1[i].addr);
printf("\n");
}
fclose(fp);
}
至于fwrite好像是對數(shù)值型的寫入有點不一樣,就算是直接以“w”格式寫入也是會出現(xiàn)不是直接看到數(shù)值
標(biāo)題名稱:c語言函數(shù)讀取指針 C語言指針指向函數(shù)
文章位置:http://vcdvsql.cn/article14/hejgge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、品牌網(wǎng)站建設(shè)、定制網(wǎng)站、企業(yè)網(wǎng)站制作、全網(wǎng)營銷推廣、品牌網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)