C语言文件操作

摘要:本文总结了C语言中文件操作函数:fopen, fclose;  fgetc, fputc; fgets, fputs; fscanf, fprintf; fread, fwrite; fseek。 并且给出了极为简单的实例。

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,此时 表示本次操作结束。

while( (ch = fgetc(fp)) != EOF )
{
do_by_char();
}

2.2 int fputc(int ch,FILE *stream)

函数完成将字符ch的值写入所指定的流文件的当前位置处,并将文件指针后移一位。
fputc()函数的返回值是所写入字符的值,出错时返回EOF。 

2.3 getchar putchar

#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 (文件结束符)为止,或读入了所限定的字符数。

while( fgets(str, 128, fp) != NULL )
{
do_by_line();
}

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值,失败返回非零值。

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用法相同

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个字符长, 函数操作成功时返回所写字段数。关于成块的文件读写,在创建文件时只能以二进制文件格式创建。

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,文件)