灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2814回复:0

C语言文件操作

楼主#
更多 发布于:2013-07-09 13:00
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——结尾

喜欢0 评分0
游客

返回顶部