C語言之_雙重指標、多檔案、include、檔案
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、不需要的時候,檔案要 及時 關閉
相關文章
- C語言之標準檔案操作C語言
- C++ include標頭檔案引入規則C++
- 檔案指標指標
- C語言 - 標頭檔案包含C語言
- c語言多檔案編譯C語言編譯
- c語言之解釋複雜指標C語言指標
- 【C語言】linux下多檔案編譯C語言Linux編譯
- Linux--檔案描述符、檔案指標、索引節點Linux指標索引
- C語言關於標頭檔案的使用C語言
- C語言判斷檔案存在和建立檔案C語言
- python移動檔案指標seekPython指標
- C 語言專案中標頭檔案包含的最佳實踐
- C 語言標頭檔案作用的簡單理解
- C語言標頭檔案到底是什麼?C語言
- C語言-檔案讀寫C語言
- C/C++標頭檔案一覽C++
- C/C++標頭檔案太難記?一個萬能標頭檔案全搞定!C++
- vscode除錯多C++檔案專案VSCode除錯C++
- 巨集_變數_函式_指標_標頭檔案變數函式指標
- c++筆記_標頭檔案C++筆記
- Include檔案易犯編譯錯誤編譯
- C語言標頭檔案組織與包含原則C語言
- C語言中的標頭檔案中的巨集定義C語言
- C檔案與檔案的操作
- SpringMVC檔案上傳下載(單檔案、多檔案)SpringMVC
- locate標頭檔案和庫檔案
- 如何組織構建多檔案 C 語言程式(二)
- 如何組織構建多檔案 C 語言程式(一)
- C語言實現檔案加密C語言加密
- 用c語言處理檔案C語言
- C語言實現檔案複製功能(包括文字檔案和二進位制檔案)C語言
- 判斷檔案為文字檔案還是二進位制檔案(C語言實現)C語言
- C/C++檔案語法區分+__cplusplusC++
- 關於C++的標頭檔案C++
- 重新命名vue檔案後ts爆紅。檔案xxx不在專案xxx的檔案列表中。專案必須列出所有檔案,或使用 "include" 模式。Vue模式
- 8.13 標頭檔案剖析:標頭檔案路徑(下)
- JAVA呼叫C語言下的DLL檔案JavaC語言
- XYPlorer 21,多標籤檔案管理器
- C++標準庫名字和標頭檔案--表C++