C語言之_雙重指標、多檔案、include、檔案

魚弦發表於2016-09-27


1、雙重指標

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void modify_p(int *p)
{
*p=*p+1;
}
int main()
{
int a=100;
int *p=&a;
modify_p(p);
printf("%p\n",p);
return 0;
}




////
//a值被改變了,而p值沒有被改變


void modify_p(int *p)
{
*p=*p+1;
}
int main()
{
int a=100;
int *p=&a;
modify_p(p);
printf("%p\n",p);
return 0;
}




//需求:就是要改p   ------必須要用 雙重指標
void modify_p(int **p)
{
*p=*p+1;
}
int main()
{
int a=100;
int *p=&a;
modify_p(&p);
printf("%p\n",p);
return 0;
}






知識點:----函式可以用它的 返回值 來替換
int sum_bmd(int a,int b)
{
int result=a+b;
return  result;
}


int main()
{
int a=10;
int b=20;
30;



return 0;
}




多檔案
//main.cpp
#include <stdio.h>
float sum(float a,float b);




int main()
{
float a=10.1f;
float b=20.1f;
float result=sum(a,b);
printf("sum is %f\n",result);


return 0;
}




//math_bmd.h------介面
float sum(float a,float b);




//math_bmd.cpp
float sum(float a,float b)
{


return a+b;
}


說明:
實際專案中有這種情況:
math_bmd.h和math_bmd.cpp是別的程式設計師寫。他有可能以後會只提供 .h檔案,而.cpp檔案用1個二進位制庫檔案來代替。
我們如夠要用它的若干函式,就只能看.h 檔案了-------.h檔案中的函式,可以知識庫中的1部分,公開的函式原型-----介面函式




檔案




將3個學生資訊----輸出到 顯示器檔案
程式碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct Student
{
int number;
char *name;
};


int main()
{
struct Student stu[3]={1001,"zhangsan",1002,"lisi",1003,"wangwu"};
for(int i=0;i<3;i++)
{
printf("number is %d name is %s ",stu[i].number,stu[i].name);
}


return 0;
}




//改為輸出到 磁碟檔案a.txt
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct Student
{
int number;
char *name;
};


int main()
{
FILE *fp;
fp=fopen("a.txt","w");

struct Student stu[3]={1001,"zhangsan",1002,"lisi",1003,"wangwu"};
for(int i=0;i<3;i++)
{
fprintf(fp,"%d %s ",stu[i].number,stu[i].name);
}


return 0;
}






//從鍵盤檔案讀入3個學生資訊
//從磁碟檔案a.txt讀入3個學生資訊
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct Student
{
int number;
char *name;
};


int main()
{
struct Student stu[3];
char buffer[20]={'\0'};
FILE *fp=fopen("a.txt","r");




for(int i=0;i<3;i++)
{
fscanf(fp,"%d %s ",&stu[i].number,buffer); //fp為磁碟檔案。如果改為stdin,就成了從鍵盤檔案讀入了
stu[i].name=(char *)malloc(strlen(buffer)+1);
strcpy(stu[i].name,buffer);


}


for(int j=0;j<3;j++)
{
printf("%d %s ",stu[j].number,stu[j].name);
}


return 0;
}




開啟檔案失敗的判斷和處理方法:
FILE *fp=fopen("a.txt","r");
if(fp==NULL)
{
printf("檔案開啟失敗--無此檔案");
return 1;
}


w----意義比較特殊
FILE *fp=fopen("a.txt","w");//w代表,不夠有無a.txt,都會重新建立


利用兩個fopen的返回值,來進行操作。






fp=fopen("a.txt","w+"); //a.txt仍然會重新建立。但也可以讀了。


fp=fopen("a.txt","a");   //追加。   當無a.txt時,會新建   只能寫檔案,不能讀


fp=fopen("a.txt","a+");   //也可以讀






//如果a.txt檔案存在,但內容為空,則會列印出 無效的數字
int main()
{
struct Student stu[3];
char buffer[20]={'\0'};
FILE *fp=fopen("a.txt","r");
int num;
fscanf(fp,"%d",&num);
printf("num is %d\n");


return 0;
}






//判斷檔案內容是否為 空 的語句
int main()
{
struct Student stu[3];
char buffer[20]={'\0'};
FILE *fp=fopen("a.txt","r");
fseek(fp,0,SEEK_END); //讓遊標走到檔案末尾
int pos=ftell(fp); //返回當前遊標的位置  利用特點:遊標走到檔案末尾,然後呼叫ftell,如果返回為0,就說明為空間。
printf("pos is %d\n",pos);


return 0;
}


333333
//feof(fp)的用法----判斷是否到檔案末尾了
程式碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct Student
{
int number;
char *name;
};
int main()
{
struct Student stu[30];
char buffer[20]={'\0'};
FILE *fp=fopen("a.txt","r");
int i=0;
//fseek(fp,0,SEEK_END);
//fseek(fp,0,SEEK_SET);




while(!feof(fp)) //如果檔案沒有到結尾,就執行 迴圈體
{


fscanf(fp,"%d %s ",&stu[i].number,buffer); //fp為磁碟檔案。如果改為stdin,就成了從鍵盤檔案讀入了
stu[i].name=(char *)malloc(strlen(buffer)+1);
strcpy(stu[i].name,buffer);
i++;

}

for(int j=0;j<3;j++)
{
printf("%d %s ",stu[j].number,stu[j].name);
}

return 0;
}






檔案讀取函式
fprintf
fscanf


fgechchar
fgets


fread
fwite


rewind(fp)------遊標回到起始位置    等價於   fseek(fp,0,SEEK_SET);








//例子:先將3個學生資訊,寫到檔案;然後又從檔案來讀取,並列印輸出
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct Student
{
int number;
char *name;
};


int main()
{
FILE *fp;
fp=fopen("a.txt","w+"); //w+表示,能寫入檔案了,有增強了1下,所以也能讀了
char buffer[30]="";
int i;

struct Student stu[3]={1001,"zhangsan",1002,"lisi",1003,"wangwu"};
for(i=0;i<3;i++)
{
fprintf(fp,"%d %s ",stu[i].number,stu[i].name);
}




rewind(fp);
for(i=0;i<3;i++)
{
memset(buffer,0,30);        //memset的用:將buffer中的值,改為0,改30個----
fscanf(fp,"%d %s ",&stu[i].number,buffer); //fp為磁碟檔案。如果改為stdin,就成了從鍵盤檔案讀入了
stu[i].name=(char *)malloc(strlen(buffer)+1);
strcpy(stu[i].name,buffer);

}

for(int j=0;j<3;j++)
{
printf("%d %s ",stu[j].number,stu[j].name);
}


return 0;
}






//fclose(fp)的用法----一定要用fclose,否則,輸出快取中的內容,可能還沒有寫到檔案
int main()
{
FILE *fp;
fp=fopen("a.txt","w+");
char buffer[30]="";
int i;

struct Student stu[3]={1001,"zhangsan",1002,"lisi",1003,"wangwu"};
for(i=0;i<3;i++)
{
fprintf(fp,"%d %s ",stu[i].number,stu[i].name);
}
fclose(fp);



return 0;
}






容易犯錯的地方:
1、1個檔案只能用fopen開啟1次,不要重複開啟
2、要使用fclose關閉後,才能再次 開啟
3、不需要的時候,檔案要 及時 關閉









相關文章