最近經常會使用C語言讀寫文件,所以在此總結一下。
在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>
int
main(
int
argc,
char
**
argv)
{
/*File
open and test*/
FILE
*fp;
char
ch[64];
/*打開文件*/
if
((fp=
fopen
(argv[2],argv[1]))==NULL)
{
printf
(
"文件打開出錯,請檢查文件是否存在\n"
);
return
-1;
}
else
printf
(
"文件已經打開。"
);
/*讀取文件*/
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"
);
return
0;
}
}
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);//將文件指針重置到文件最前面