C文件读写
原文鏈接:http://www.cnblogs.com/bugY/archive/2011/08/24/2151921.html
在C語言中,文件操作都是由庫函數來完成的,可以分為讀和寫兩種操作。操作流程為使用fopen()打開文件>>使用下面的庫函數讀或寫文件>>fclose()關閉文件。
?下面先列出會用到的庫函數。
一、打開文件
fopen() 用來打開文件操作。
語法:文件指針名=fopen(文件路徑,使用文件方式);
例子:FILE *fs = fopen("D:\\1.txt","w+");//這里是使用讀寫的方式打開D:\1.txt文件,同時返回一個FILE類型的指針,如果文件打不開,返回NULL
使用文件的方式共有12種,下面給出了它們的符號和意義。
“rt”???只讀打開一個文本文件,只允許讀數據?
“wt”?只寫打開或建立一個文本文件,只允許寫數據?
“at”?追加打開一個文本文件,并在文件末尾寫數據
“rb”?只讀打開一個二進制文件,只允許讀數據?
“wb”?只寫打開或建立一個二進制文件,只允許寫數據?
“ab”?追加打開一個二進制文件,并在文件末尾寫數據?
---------上面每種方式只有一個功能,也就是只讀或者只寫或者追加,下面的是通過‘+’這個符號,有了可讀可寫兩種能力----------------------------------
“rt+”?讀寫打開一個文本文件,允許讀和寫?
“wt+”?讀寫打開或建立一個文本文件,允許讀寫?
“at+”?讀寫打開一個文本文件,允許讀,或在文件末追加數據?
“rb+”?讀寫打開一個二進制文件,允許讀和寫?
“wb+”?讀寫打開或建立一個二進制文件,允許讀和寫?
“ab+”?讀寫打開一個二進制文件,允許讀,或在文件末追加數據?
現在對上面的文件打開方式做個總結:
文件使用方式由r,w,a,t,b,+六個字符拼成,各字符的含義是:?
r(read): 讀?
w(write): 寫?
a(append): 追加?
t(text): 文本文件,可省略不寫?
b(banary): 二進制文件?
+: 讀和寫?
?二、讀或寫文件操作:
·字符讀寫函數 :fgetc和fputc?
語法:int fgetc(FILE *stream);//返回值: 讀出字符的ASCII碼或EOF(文件結束時)
?int fputc(int ch, file *fp);//?ch:?待寫入文件的字符的ASCII碼? ? ? fp: 待寫文件的文件指針? ? ? 返回值: 如寫入成功則返回寫入的字符, 否則返回EOF
·字符串讀寫函數:fgets和fputs?
char *fgets(char *str, int num, FILE *fp) //?str:?保存從文件讀取出來的字符串? ? ?? fp: 待讀文件的文件指針
?num: 表示從文件中讀出的字符串不超過 n-1個字符。在讀入的最后一個字符后加上串結束標志'\0'
?·字符讀寫函數 :fgets和fputs??
??char * fgets(char * s, int n, FILE * stream);當讀到n - 1個字符或換行符時,fgets函數將停止操作。該函數在s的末尾保留換行符,s的末尾增加了一個NULL字符標明串的結束。如果調用成功。將返回由指針s指向的串,如果遇到文件結束符或出錯,將返回EOF。?
? ?fputs(char * s,FILE * stream);
·數據塊讀寫函數:freed和fwrite?
語法:
?fread(buffer,size,count,fp);
?fwrite(buffer,size,count,fp);
解釋:
buffer:是一個指針,對fread來說,它是讀入數據的存放地址。對fwrite來說,是要輸出數據的地址。
? size:要讀寫的字節數;
? count:要進行讀寫多少次size字節的數據項;
? fp:文件型指針。
·格式化讀寫函數:fscanf和fprinf?
語法:int fprintf( FILE *stream, const char *format [, argument ]...); //例子:fprintf(fp, "%s %s %d %f", str1,str2, a, b) ;
int fscanf(FILE*stream,char *format[,argument...]);
下面通過一段代碼來總結這些函數:
#include <stdio.h> #include <string.h> intmain(intargc, char** argv) { ????/*File open and test*/ ????FILE*fp; ????charch[64]; ????/*打開文件*/ ????if((fp=fopen(argv[2],argv[1]))==NULL) ????{ ????????printf("文件打開出錯,請檢查文件是否存在\n"); ????????return-1; ????} ????elseprintf("文件已經打開。"); ????/*讀取文件*/ ????if(*argv[1]=='r') ????{ ????????printf("文件內容是:\n"); ????????printf("-------------------------------------------\n"); ????????while(!feof(fp))//判定文件是否結尾 ????????{ ????????????if(fgets(ch,64,fp)!=NULL) ????????????printf("%s",ch); ????????} ????} ????/*寫文件*/ ????if(*argv[1]=='w') ????{ ????????printf("請輸入內容,關閉文件請直接回車\n"); ????????printf("-------------------------------------------\n"); ????????while(strlen(fgets(ch,64,stdin))>1) ????????{ ????????????fputs(ch,fp); ????????} ????} ????/*文件追加*/ ????if(*argv[1]=='a') ????{ ????????printf("請輸入追加內容,關閉文件請直接回車\n"); ????????printf("-------------------------------------------\n"); ????????while(strlen(fgets(ch,64,stdin))>1) ????????{ ????????????fputs(ch,fp); ????????} ????} ????/*關閉文件*/ ????if(fclose(fp)!=0) ????{ ????????printf("-------------------------------------------\n"); ????????printf("文件關閉出錯\n"); ????????return-1; ????} ????else ????{ ????????printf("-------------------------------------------\n"); ????????printf("文件以關閉\n"); ????????return0; ????} } ?
ftell語法
?long ftell(FILE *fp);//得到流式文件的當前讀寫位置,其返回值是當前讀寫位置偏離文件頭部的字節數.
fseek語法
語法:int fseek(FILE *fp,long offset,int origin);//把fp的文件讀寫位置指針移到指定的位置.
origin指的是“起始點”,它有三個常量的值,如下:
| 起始點 | 對應的數字 | ? 代表的文件位置 |
| SEEK_SET | 0 | ? 文件開頭 |
| SEEK_CUR | 1 | ? 文件當前位置 |
| SEEK_END | 2 | ? 文件末尾 |
rewind語法
語法:int rewind(FILE *stream); //將文件指針重新指向一個流的開頭?
?例子:
一般我們會通過下面的方法來獲取文件中字符的個數:
FILE *fs=fopen("C:\1.txt","r");//創建文件流 long length=0;//聲明文件長度 fseek(fs,0,SEEK_END);//將文件內部指針放到文件最后面 length=ftell(fs);//讀取文件指針的位置,得到文件字符的個數 rewind(fs);//將文件指針重置到文件最前面
轉載于:https://www.cnblogs.com/melons/p/5791891.html
總結
- 上一篇: 手表电池多少钱啊?
- 下一篇: 很久之前看过的电影,记不得名字