處理檔案及資料夾多了很多要注意的事項及觀念,處理起來複雜許多。先前的字串看得太快,到這一章時就覺得有些障礙,求快的下場就是如此。但書上針對c的部份並沒有寫得太多,所以以目前的學習狀況而已,應該算是可以了吧。重點應該是在後面的C++,這也是自己要趕進度的原因。接下來的C就不能趕速度,還是儘可能的做想得到的所有測試,才不會越到後面越痛苦。
底下是「檔案與資料夾處理」這章所抽出來的相關函數的用法及部份測試說明。
- FILE *fopen(char *filename,char *mode)
- int fclose(FILE *fp)
- int fputs(char *str,FILE *fp)
- char *fgets(char *str,int num,FILE *fp)
ex: while(fgets(line,50,fp)!=NULL){} - int putc(int ch, FILE *fp)
- char getc(FILE *fp)
- int fprintf(FILE *fp, char *control,…)
ex: fprintf(fp,”%d=>%s\n”,1,line); - int fscanf(FILE *fp, char *control,…)
ex:
while(fscanf(fp,”%s”,line)!=EOF)
printf(“%s\n”,line); - fp=fopen(“filename.dat”,”wb”);
- 「C的字元和位元組被視為相同的資料型態」。應該是資料型態的大小一致的關係吧。所以可以使用getc()和putc()兩個函數來進行二進位檔案的讀寫
- 隨機存取以記錄為單位,必須要搭配「結構」來儲存記錄。
- size_t fwrite(void *ptr, size_t size, size_t n, FILE *fp)
size_t 在ANSI-C是unsigned int
ex:
student temp;
fwrite(&temp,sizeof(temp),1,fp); - int ferror(FILE *fp)
ex: if(ferror(fp))printf(“錯誤: 寫入錯誤!\n”) - size_t fread(void *ptr, size_t size, size_t n, FILE *fp)
- int feof(FILE *fp);
ex:
while(!feof(fp)){
if(fread(&std, sizeof(std),1, fp)){
}
} - int fseek(FILE *fp, long offset, int origin)
ex:
fseek(fp,rec*sizeof(temp),SEEK_SET)
ORIGIN:{ SEEK_SET,SEEK_CUR,SEEK_END} - int fflush(FILE *fp)
- long ftell(FILE *fp)
- void rewind(FILE *fp)
- remove(char *filename)
- rename(char *oname, char *nname)
- 關於scanf後面再加上一個getchar()函數來避免enter鍵的影響。應該是scanf只接受格式化字元格式的資料,不符合的資料會繼續往下傳(程式的流程),所以如果之後馬上接 scanf,先前的enter就會直接傳給它,直接影響到使用者操作。所以要使用getchar(),用它使用緩衝區及透過enter啟動的特性來避免這個問題。
- char *getcwd(char *name,int len)
- int chdir(char *path)
- int mkdir(char *path)
- int rmdir(char *path)
- 操作目錄的工作要先載入<dir.h>標頭檔(visual c++ 2005使用<direct.h>)