程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言入門知識 >> C語言之_雙重指針、多文件、include、文件

C語言之_雙重指針、多文件、include、文件

編輯:C語言入門知識

1、雙重指針

#include
#include
#include


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
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
#include
#include


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
#include
#include


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
#include
#include

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
#include
#include


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
#include
#include


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、不需要的時候,文件要 及時 關閉


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved