程序文件
源程序文件(后綴為.c)
目標文件(Windows環境后綴為.obj)
可執行文件(Windows環境后綴為.exe)
fputc
FILE* pf = fopen("test.txt","w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//寫文件char i = 0;for (i = 'a'; i <= 'z'; i++){fputc(i, pf);}
fgetc
FILE* pf = fopen("test.txt","r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//讀文件int ch = 0;while ((ch=fgetc(pf)) != EOF){printf("%c ",ch);}
fputs
FILE* pf = fopen("test.txt","w"); //w在文件打開的時候就清理掉數據了//寫文件的時候,如果有內容,會銷毀再重新寫數據//FILE* pf = fopen("test.txt", "a"); 寫a可以實現追加if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//寫一行數據fputs("hello world\n", pf);
fgets
FILE* pf = fopen("test.txt","r"); if (pf == NULL){perror("fopen");return 1;}//讀一行數據char arr[20];fgets(arr, 5, pf); //讀5個字符,但自己加一個\0,實際讀四個printf("%s\n", arr); //hello中只讀了hell
fprintf
struct s
{char arr[10];int age;float score;};
int main()
{ struct s s = { "zs",22,23.3f };FILE* pf = fopen("test.txt","w"); if (pf == NULL){perror("fopen"); //fopen是自己加的return 1;}fprintf(pf,"%s %d %f", s.arr, s.age, s.score);//關閉文件fclose(pf);pf = NULL;return 0;
}
fscanf
格式化輸入函數
struct s s = { 0 };FILE* pf = fopen("test.txt","r"); if (pf == NULL){perror("fopen"); //fopen是自己加的return 1;}fscanf(pf, "%s %d %f", s.arr, &(s.age), &(s.score));printf("%s %d %f", s.arr, s.age, s.score);
流
任何一個c程序,只要運行起來,就會默認打開三個流
它們的類型都是FILE*
FILE* stdin - 標準輸入流 (鍵盤)
FIEL* stdout - 標準輸出流(屏幕)
FILE* stderr - 標準錯誤流(也是屏幕)
fprintf(stdout,"%s %d %f", s.arr, s.age, s.score); //打印到屏幕上去
fwrite
以二進制的形式寫進文件中
struct s s = {"zhangsan",25,50.5f};FILE* pf = fopen("test.txt","wb"); if (pf == NULL){perror("fopen"); return 1;}fwrite(&s, sizeof(struct s), 1, pf);
fread
以二進制的方式讀
struct s s = {0};FILE* pf = fopen("test.txt","rb"); if (pf == NULL){perror("fopen"); return 1;}fread(&s, sizeof(struct s), 1, pf);printf("%s %d %f", s.arr, s.age, s.score);
scanf是針對標準輸入的格式化輸入語句
printf是針對標準輸入的格式化輸出語句
fscanf是針對所有輸入流的格式化輸入語句
fprintf是針對所有輸入流的格式化輸出語句
sscanf從一個字符串中轉化成一個格式化的數據 (序列化)
sprintf 把一個格式化的數據轉化成字符串(反序列化)
struct s s = {"zhangsan",20,55.5f};struct s tmp = { 0 };char buf[100] = { 0 };sprintf(buf, "%s %d %f", s.arr, s.age, s.score);//sprintf 把一個格式化的數據寫到字符串中,本質是把一個格式化的數據轉換成字符串printf("%s\n", buf);sscanf(buf, "%s %d %f", tmp.arr, &(tmp.age), &(tmp.score)); //從字符串中獲取一個格式化的數據到tmp中printf("%s %d %f\n", tmp.arr, tmp.age, tmp.score);
fseek定位文件指針,ftell計算當前文件指針的偏移量
fseek(pf, 2 ,SEEK_SET); //文件內容abcdef 直接定位到cint ch = fgetc(pf); printf("%c ", ch);printf("%d\n", ftell(pf)); //3fseek(pf, 2, SEEK_CUR); //文件內容abcdef 直接定位到fch = fgetc(pf);printf("%c ", ch);printf("%d\n", ftell(pf)); //6fseek(pf, -1, SEEK_END);ch = fgetc(pf);printf("%c ", ch);printf("%d\n", ftell(pf)); //6
rewind讓文件指針位置回到文件起始位置
rewind(pf);ch = fgetc(pf);printf("%c ", ch); //a
feof應用于當文件讀取結束的時候,判斷是讀取失敗結束還是文件尾結束
文本文件讀取是否結束判斷,判斷返回值是否為EOF或者NULL
fgetc判斷是否為EOF
fgets判斷返回值是否為NULL
二進制文件的讀取結束判斷判斷返回值是否小于實際要讀的個數
fread判斷返回值是否小于實際要讀的個數
//判斷是什么原因結束的if (ferror(pf)){puts("I?O error when reading ");}else if (feof(pf)){puts("end of the file reached successfully");}
文件緩沖區
因為有緩沖區的存在,C語言在操作文件的時候,需要做刷新緩沖區或者在文件操作結束的時候關閉文件
如果不做,可能導致讀寫文件的問題