本次详细介绍C下文件的各种API.
1. 文件的打开与关闭
1)打开文件
FILE *fopen( const char * filename,const char * mode);
返回文件句柄,非NULl
为正确打开。
2)关闭文件
int fclose( FILE * stream);
例子:
FILE * pSrc = fopen("DATA5610.TXT", "r");
if (pSrc == NULL)
{
printf("can't open file\n");
return 0;
}
2. 按照固定格式读写文件(适用于文本格式)
1)fscanf从文件中按照固定格式读取
fscanf
适用于读取以文本格式打开的文件。并且,文本的读取必须按照固定的格式(format)读取。类似于scanf
,只不过数据是从文件中读取,而非标准的显示屏中。
int fscanf( FILE * stream,
const char * format[, argument]...
);
2)fprintf按照固定格式写入文件中
类似于printf
,只不过数据是保存在文件中,而非标准的显示屏中。
int fprintf( FILE* stream,const char * format [, argument ]...);
例子:
while ( fscanf(pSrc, "%d%s", &i, str)!=EOF )
{
fprintf(pDest, "%d--%s", i, str);
}
3. 按字节读写文件
1)fgetc适合于从文件中一次读取一个字节
int fgetc( FILE * stream);
fgetc
适合于一次从文件中读取一个字节,并且每个字节被当作一个无符号的8位(二进制)数,取值范围为0-255,类似于getchar()
。
int getchar( void );
2)fputc适用于向文件中依次读入一个字节
int fputc( int c,FILE * stream);
类似于putchar()
int putchar( int c);
例子:
while ( (c= fgetc(pSrc)) != EOF )
fputc(c, pDest);
4. 按行读写文件
1) fgets
一次从文件中读取一行,包括换行符,并在字符串的最后添加'\0'
。
char *fgets( char * string,int n,FILE * stream);
其中, n
表示的为string中最大保存的字符数,通常,为了预留一位保存'\0'
,长度通常取(sizeof(string)-1)
。
2)fputs
一次向文件中写入一行数据
int fputs( const char * string,FILE * stream);
例子:
while ( fgets(str, sizeof(str)-1, pSrc) )
fputs(str, pDest);
与gets
和puts
函数的区别:
gets
函数从标准流stdio
中读取数据,不判断上界,直到读取到'\n'
或者EOF
才停止。换行符 不作为读取的字符串的内容,而是被转化为'\0'
保存在指定的内存空间中。
puts
函数是一个将制定字符串输入到标准输出流stdout
中,输出的停止标志位读取到字符串中的'\0'
,但是,puts
会在输出字符串之后自动输出一个换行符。也就是说puts(char * s)
与printf("%s\n", s)
的作用是相同的。
5. 按照数据块读写文件
1)fread从文件中读
size_t fread( void * buffer,size_t size,size_t count,FILE * stream);
fread
从文件中读取count*size
字节的数据,或者说读取count
个size
字节大小的数据,并保存到buffer
指向的内存中。
返回值为成功读取的size
大小的数据块的个数。
2)fwrite向文件中写
size_t fwrite( const void*buffer,size_t size,size_t count,FILE*stream);
fwrite
将buffer
指向的内存中的count
个size
大小的数据写入到文件中。返回值表示成功写入的数据个数count。
例子:
while ( fread(&buffer, sizeof(struct stru), 10, pSrc) )
fwrite(&buffer, sizeof(struct stru), 10, pDest);
6. 从特定位置随机读写文件中的数据
int fseek(FILE * stream,long offset,int origin );
该函数将指向文件stream
的文件指针设置到距离origin
处offset
偏移字节处的地方。
origin
的取值:
SEEK_SET
:文件开始处;
SEEK_CUR
:执行本函数之前,文件指针所在位置;
SEEK_END
:文件结尾处
另外,fseek
函数通常与fread
和fwrite
一同完成从某个特定位置读写数据。
例子:
fseek(pSrc, 1, SEEK_SET); //从文件开始处偏移一个字节
fread(&buffer, sizeof(char), 6, pSrc); //从偏移处读取6*sizeof(char)个数据
fwrite(&buffer, sizeof(char), 6, pDest); //从偏移处读取6*sizeof(char)个数据存入文件pDest中