1. 概述
(1) 标准文件编程库中胜于文件创建、打开、关闭和删除的函数有:
l fopen: 打开文件流或创建文件函数
l freopen: 文件流替换函数
l fclose: 关闭文件流
l remove: 删除文件函数
l rename: 文件更名函数
(2) 标准文件编程库中用于无格式字符输入的函数有getc, getchar, 和fgetc等。
(3) 标准文件编程库中用于无格式字符输出的函数有putc, putchar和fputc等。
(4) 标准文件编程库中用于文件行输入的函数有gets和fgets等。
(5) 标准文件编程库中用于文件行输出的函数有puts和fputs等。
(6) 标准文件编程库中用于文件块输入输出的函数有fread和fwrite等。
(7) 标准文件编程库中用于格式化输出的函数有printf、fprintf和sprintf等
(8) 标准文件编程库中用于格式化输入的函数有scanf、fscanf和sscanf等。
(9) 标准文件编程库中用于定位文件读写位置的函数有:
l fseek: 设置文件流当前位置
l rewind: 重置文件流
l ftell: 获取文件流
(10) 标准文件编程库中用于文件状态的函数如下:
l feof:判断文件流是否结束。
l ferror: 判断文件流操作是否发生错误。
l clearer: 置空文件流中的错误标志。
(11) 标准文件编程库提供了三种缓冲模式:全缓冲、行缓冲和无缓冲,其中用于文件缓冲的函数有:
l setbuf: 设置缓冲模式(缓冲大小为BUFSIZ)
l setvbuf: 设置缓冲模式(缓冲大小由调用者指定)
l fflush: 刷新缓冲区
2. 实践经验
文件读写:r模式一般应用于读文件处理中,比如批量代发时读入第三方上送的交易数据,导入第三方提供的报表文件数据等。w模式一般应用在单进程文件写入处理中,比如报表文件的创建与完成等。a模式一般应用于多个进程同时写入同一文件的处理中,比如记录日志文件等。
文件指针在打开后务必检查是否可用。函数freopen常用于比标准输入、输出和错误进行重定向。
设计用户直接阅读的文件时,选择文本文件。设计程序阅读的文件时,选择二进制文件。
字符输入函数族虽然每次读取一个字符,但是其返回值为整型,故在返回值变量中务必定义为“int”,而不是“char”或“unsigned char”,否则将会读取到错误的信息。
如果程序需要同时打开两个以或两个以上文件,当后一个文件的打开操作发和错误,而不得不退出时,请务必关闭前面已经打开的文件。
3. 例子
3.1 变长参数
#include <stdarg.h>
int mysum(int I, …)
{
int r = 0;
int j = 0;
va_list pvar;
va_start(pvar, i);
for(j=0; j<i; j++)
{
r += va_arg(pvar, int);
}
va_end(pvar);
return r;
}
int printLog(FILE * pfile, const char * pformat, …)
{
va_list _va_list;
char szBuf[1024];
if(pformat == NULL || pfile == NULL)
return -1;
va_start(_va_list, pformat);
vsprintf(szBuf, pformat, _va_list);
va_end(_va_list);
fputs(szBuf, pfile);
return 0;
}
PS: od命令用于dump files in octal and other formats
1.1 文件的状态
标准文件编程库中用于文件状态的函数如下:
int ferror(FILE *stream);
int feof(FILE *stream);
int clearer(FILE *stream);
//在错误发生后立马调用语句“sterror(errno)”可以获取当前的错误提示信息
实例代码:
char *strerror(int errnum);
/**
*读取文件”etc/passwd",当文件结束时自动退出
*/
#include <stdio.h>
int main()
{
FILE *fp;
char buf[1024];
if((fp=fopen("/etc/passwd", "r")) == NULL)
{
printf("Open file passwd failed./n");
return;
}
//标注红线部分为函数feof的调用模板
while(!feof(fp))
{//feof 在文件读取结束后返回非0值
fgets(buf, sizeof(buf), fp);
if(feof(fp))
break;
fputs(buf, stderr);
}
return 0;
}