1. fopen fclose
1.1 FILE * fopen(const char * path,const char * mode)
(1) return
文件順利打開後,指向該流的文件指針就會被返回。如果文件打開失敗則返回NULL,並把錯誤代碼存在errno 中。
所以測試文件是否打開可以這樣:
if( fp == NULL )
do_error();
(2) Mode:
r (讀)w(寫)a(追加)
b(二進制操作)
+(允許讀寫)
r 以只讀方式打開文件,該文件必須存在。
r+ 以可讀寫方式打開文件,該文件必須存在。
rb+ 讀寫打開一個二進制文件,允許讀寫數據。
rw+ 讀寫打開一個文本文件,允許讀和寫。
w 打開只寫文件,若文件存在則文件長度清為0,即該文件內容會消失。若文件不存在則建立該文件。
w+ 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。
a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(EOF符保留)
a+ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾後,即文件原先的內容會被保留。 (原來的EOF符不保留)
wb 只寫打開或新建一個二進制文件;只允許寫數據。
wb+ 讀寫打開或建立一個二進制文件,允許讀和寫。
ab+ 讀寫打開一個二進制文件,允許讀或在文件末追加數據。
at+ 打開一個叫string的文件,a表示append,就是說寫入處理的時候是接著原來文件已有內容寫入,不是從頭寫入覆蓋掉,t表示打開文件的類型是文本文件,+號表示對文件既可以讀也可以寫。
1.2 fclose( FILE* fp )
與fopen配對,當你yongfopen打開文件後,必須使用fclose關閉文件。
2. fgetc fputc 字符
2.1 int fgetc(FILE *stream)
函數從輸入流的當前位置返回一個字符,並將文件指針指示器移到下一個字符處,如果已到文件尾,函數返回EOF,此時 表示本次操作結束。
[cpp]
<SPAN style="FONT-SIZE: 14px">while( (ch = fgetc(fp)) != EOF )
{
do_by_char();
}</SPAN>
while( (ch = fgetc(fp)) != EOF )
{
do_by_char();
}
2.2 int fputc(int ch,FILE *stream)
函數完成將字符ch的值寫入所指定的流文件的當前位置處,並將文件指針後移一位。
fputc()函數的返回值是所寫入字符的值,出錯時返回EOF。
2.3 getchar putchar
[cpp]
<SPAN style="FONT-SIZE: 14px">#define getchar() getc( stdin )
#define putchar( c ) putc( (c), stdout )</SPAN>
#define getchar() getc( stdin )
#define putchar( c ) putc( (c), stdout )
3. fgets fputs 行
3.1 char *fgets(char *line,int line_size,FILE *fp)
從流文件fp中讀取至多line_size-1個字符,並把它們放入line指向的字符數組中。讀取字符直到遇見回車符或EOF (文件結束符)為止,或讀入了所限定的字符數。
[cpp]
<SPAN style="FONT-SIZE: 14px">while( fgets(str, 128, fp) != NULL )
{
do_by_line();
}</SPAN>
while( fgets(str, 128, fp) != NULL )
{
do_by_line();
}
[cpp]
<SPAN style="FONT-SIZE: 14px">char* fgets( char *s, int n, FILE *fp )
{
register int c;
register char *cs;
cs = s;
while( --n > 0 && ( c=getc(fp) ) != EOF )
if( (*cs++ = c) == '\n' )
break;
*cs = '\0';
return ( c == EOF && cs == s )? NULL : s;
}</SPAN>
char* fgets( char *s, int n, FILE *fp )
{
register int c;
register char *cs;
cs = s;
while( --n > 0 && ( c=getc(fp) ) != EOF )
if( (*cs++ = c) == '\n' )
break;
*cs = '\0';
return ( c == EOF && cs == s )? NULL : s;
}
3.2 int fputs(char *line,FILE *fp)
操作成功時,函數返回0值,失敗返回非零值。
[cpp]
<SPAN style="FONT-SIZE: 14px">int fputs( char *line , FILE *fp )
{
int c ;
while( c = *s++ )
putc( c, fp );
return ferror( fp )? EOF : 0;
}</SPAN>
int fputs( char *line , FILE *fp )
{
int c ;
while( c = *s++ )
putc( c, fp );
return ferror( fp )? EOF : 0;
}
4. fscanf fprintf 格式化
4.1· int fscanf(FILE *stream,char *format,arg_list)
與scanf用法相同
4.2 int fprintf(FILE *stream,char *format,arg_list)
與printf用法相同
[cpp]
<SPAN style="FONT-SIZE: 14px">while( fscanf( fp, "%s%d", str, &i ) != EOF )
{
fprintf( stdout, "%s \t %d", str, i );
}</SPAN>
while( fscanf( fp, "%s%d", str, &i ) != EOF )
{
fprintf( stdout, "%s \t %d", str, i );
}
5. fread fwrite 塊
5.1 int fread(void *buf,int size,int count,FILE *stream)
fread()函數從stream 指向的流文件讀取count (字段數)個字段,每個字段為size(字段長度)個字符長,並把它們放到b u f(緩沖區)指向的字符數組中。
fread()函數返回實際已讀取的字段數。若函數調用時要求讀取的字段數超過文件存放的字段數,則出錯或已到文件尾,實際在操作時應注意檢測。
5.2 int fwrite(void *buf,int size,int count,FILE *stream)
函數從buf(緩沖區)指向的字符數組中,把count(字段數)個字段寫到stream所指向的流中,每個字段為size個字符長, 函數操作成功時返回所寫字段數。關於成塊的文件讀寫,在創建文件時只能以二進制文件格式創建。
[cpp]
<SPAN style="FONT-SIZE: 14px">while ( !feof( fp ) )
{
fread( str, sizeof(int), 127, fp );
}</SPAN>
while ( !feof( fp ) )
{
fread( str, sizeof(int), 127, fp );
}
6. fseek
int fseek( FILE *fp, long offset , mode )
mode :
SEEK_SET : 0 ——開頭
SEEK_CUR: 1——當前
SEEK_END: 2——結尾