C语言文件操作
3614 点击·0 回帖
![]() | ![]() | |
![]() | 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——结尾 | |
![]() | ![]() |