当前位置:编程学习 > C/C++ >>

C语言文件操作

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——结尾

 

 

 

 

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,