標籤:logs pre int 丟失 ken 結束 max 完全 size
1.指向指標的指標
#include<stdio.h>int main(){ char *a[] = { "hello","world","my","love" }; char **p; //*p表示p為指標變數,char *表示p指向char *類型的變數 p = a; //p = &a[0] printf("%s\n", *p);//輸出a[0] return 0;}
2.函數指標
int (*p)(int, int);//定義一個函數指標p,指向的函數有兩個int類型的形參,函數傳回值為int型。
#include<stdio.h>int main(){ void(*p)(int, int); void max(int, int); void min(int, int); int n = 0; scanf_s("%d", &n); if (n == 1) p = max; else p = min; (*p)(3, 4); return 0;}void max(int x, int y){ printf("%d\n", x > y ? x : y);}void min(int x, int y){ printf("%d\n", x < y ? x : y);}
函數指標就是函數的入口地址。
3.結構體
/*方法一*/struct Student{ ...}student1,student2;/*方法二*/struct Student{ ...};struct Student student1, student2;//struct Student是類型名/*方法三*/typedef struct{ ...}Student;Student student1, student2;/*方法四*/struct{ ...}student1,student2;
4.檔案類型指標
typedef struct{ short level; //緩衝區“滿”或“空”的程度 unsigned flags; //檔案狀態標誌 char fd; //檔案描述符 unsigned char hold; //如緩衝區無內容不讀取字元 short bsize; //緩衝區的大小 unsigned char* buffer;//資料緩衝區的位置 unsigned char* curp; //指標當前的指向 unsigned istemp; //臨時檔案指標 short token; //用於有效性檢查}FILE;
聲明FILE結構體類型的資訊包含在標頭檔“stdio.h”中。在程式中可以直接使用FILE類型名定義變數,每一個FILE類型變數對應一個檔案的資訊區,在其中存放該檔案的有關資訊。
FILE *fp;//定義一個指向檔案的指標變數fp;
4.檔案操作
通常將fopen函數的傳回值賦給一個指向檔案的指標變數。
FILE *fp;
fp = fopen("a1","r");
這樣fp就和檔案a1相聯絡了,或者說fp指向了a1檔案
//電腦從ASCII檔案讀入字元時,遇到斷行符號分行符號,系統把它轉換為一個分行符號,在輸出時把分行符號轉換成斷行符號和換行兩個字元。在使用二進位檔案時,不進行這種轉換,在記憶體中的資料形式與輸出到外部檔案中的資料形式完全一致,一一對應。
fclose(檔案指標);//若函數成功執行返回0,否則返回EOF(即-1)
如果不關閉檔案將會遺失資料。因為,在向檔案寫資料時,是先將資料輸出到緩衝區,待緩衝區滿後才正式輸出給檔案。如果當資料未充滿緩衝區而程式結束運行,就有可能使緩衝區中的資料丟失。用fclose函數關閉檔案,先把緩衝區中的資料輸出到磁碟檔案,然後才撤銷檔案資訊區。有的編譯系統在程式結束前會自動先將緩衝區中的資料寫入到檔案,從而避免了這個問題,但是應當養成在程式終止之前關閉所有檔案的習慣。
fgetc(fp);//從fp指向的檔案中讀入一個字元,讀成功,帶回所讀的字元,否則返回EOF
fputc(ch,fp);//把字元ch寫到檔案指標變數fp指向的檔案中,輸出成功,傳回值就是輸出的字元,輸出失敗,則返回EOF
#include<stdio.h>#include<stdlib.h>int main(){ FILE *fp; char ch, filename[30]; printf("請輸入所用的檔案名稱:"); scanf("%s", filename); if ((fp = fopen(filename, "w")) == NULL) { printf("無法開啟此檔案\n"); exit(0); } ch = getchar(); //用來接收輸入完檔案名稱後的斷行符號符 printf("請輸入一個準備儲存到磁碟中的字串(以#結束):"); ch = getchar(); while (ch != ‘#‘) { fputc(ch, fp); putchar(ch); ch = getchar(); } fclose(fp); putchar(10); //向螢幕輸出一個分行符號 return 0;}
//將一個檔案中的內容複寫到另一個檔案中
#include<stdio.h>#include<stdlib.h>int main(){ FILE *fp_in,*fp_out; char ch, filename_in[30],filename_out[30]; printf("請輸入讀入的檔案名稱:"); scanf("%s", filename_in); if ((fp_in = fopen(filename_in, "r")) == NULL) { printf("無法開啟此檔案\n"); exit(0); } printf("請輸入寫出的檔案名稱:"); scanf("%s", filename_out); if ((fp_out = fopen(filename_out, "w")) == NULL) { printf("無法開啟此檔案\n"); exit(0); } while (!feof(fp_in)) //feof函數的作用是檢查是否到檔案末尾 { ch = fgetc(fp_in); fputc(ch, fp_out); putchar(ch); } putchar(10); fclose(fp_in); fclose(fp_out); return 0;}
注意:C系統已把fputc和fgetc函數定義為宏名putc和getc
#define putc(ch,fp) fputc(ch,fp)
這是在stdio.h中定義的
char* fgets(char* str,int n,FILE* fp);
從fp指向的檔案中讀取n - 1個字元,在字串後加‘\0‘,把它們放到字元數組str中。如果在讀完n - 1個字元之前遇到分行符號‘\n‘或檔案結束符EOF,讀入即結束,但將所遇到的分行符號‘\n‘也作為一個字元讀入。若執行fgets函數成功,則傳回值為str數組首元素的地址,如果一開始就遇到檔案尾或讀資料出錯,則返回NULL。
int puts(char* str, FILE* fp);
將str所指向的字串輸出到fp指向的檔案中。字串末尾的‘\0‘不輸出。若輸出成功,函數值為0,失敗時,函數值為EOF。
C語言允許用fread函數從檔案中讀一個資料區塊,用fwrite函數向檔案寫一個資料區塊。在讀寫時是以二進位形式進行的。在向磁碟寫資料時,直接將記憶體中的一組資料原封不動、不加轉換地複製到磁碟檔案上,在讀入時也是將磁碟檔案中若干位元組的內容一批讀入記憶體。一般調用形式為:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
其中:
buffer:是一個地址。對fread來說,它是用來存放從檔案讀入的資料的儲存區地址。對fwrite來說,是要把此地址開始的儲存區中的資料向檔案輸出(以上指的是起始地址)。
size:要讀寫的位元組數
count:要讀寫多少個資料項目(每個資料項目長度為size)
fp:FILE類型檔案指標
在打卡檔案時指定用二進位檔案,這樣可以用fread和fwrite函數讀寫任何類型的資訊。
C語言複習3/27