1、打开关闭文件函数
#include <stdio.h>
FILE *fopen(const char *path, const *char mode);
FILE *freopen(const char *path, const *char mode, FILE *stream);
int fclose(FILE *stream);
|
作用:fopen以指定的模式打开一个字符串path指定的文件,返回一个文件流指针。如果文件不存在,以0666模式创建此文件。打开失败返回NULL并设置errno。
fopen使用的打开模式包括:r, r+, w, w+, a, a+, rb, rb+, wb, wb+, ab, ab+。
freopen以指定的模式打开一个字符串path指定的文件,同时使文件流指针stream指向它。它可以类似dup2那样重定向stdout,stderr等这些标准的文件流。失败返回NULL并设置errno。
fclose关闭一个文件流,此后对此文件流指针的访问会导致出现不可预料的结果,必须采取相关处理方式。
失败返回EOF并设置errno。
另有一个非ANSI C的POSIX调用fdopen,用于以指定的模式打开一个文件描述符,返回文件流指针。原型为:
#include <stdio.h>
FILE *fdopen(int fd, const char *mode);
|
2、读写文件
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(void ptr, size_t size, size_t nmemb, FILE *stream);
|
作用:fread把已经打开的文件流stream读取到ptr所指定的缓冲区,每次调用依次读取nmemb个size大小的文件块。
fwrite则读取nmemb个size大小的文件块从ptr写入到stream。
3、文件状态
#include <stdio.h>
int feof(FILE *stream);
int ferror(FILE *stream);
void clearerr(FILE *stream);
int fileno(FILE *stream);
|
作用:feof用于检测EOF结束标志,同时返回非零值,但此时一般已经超出文件末尾。
feror用于检测文件流的出错标志,同时返回非零值。
clearerr用于清除文件流的EOF标志和出错标志。
fileno为非标准ANSI C调用,返回和文件流stream相关的文件描述符,以执行基于文件描述符的I/O操作。
4、printf族格式化输出
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
|
作用:格式化输出字符串到标准输出(printf)、文件流(fprintf)、缓冲区(sprintf, snprintf)。
ANSI C的sprintf由于不检验缓冲区长度,容易遭受缓冲区溢出的攻击,应以POSIX的snprinf取代。
#include <stdarg.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char format, va_list ap);
int vspintf(char *ptr, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
|
作用:这是一组带可变参数列表的printf函数族,但是至少要有一个固定参数,后面必须包含“...”以表明可变参数开始。
5、scanf族格式化输入
#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
|
#include <stdarg.h>
int vscanf(const char *format, va_list ap);
int vfscanf(FILE *stream, const char *format, va_list ap);
int vsscanf(const char *ptr, const char format, va_list ap);
|
作用,和printf相反,scanf族从标准输入/文件流/缓冲区读取参数到格式化的相关变量中,同时注意变量要加“&”地址运算符,除了字符串变量通常不需要加“&”。另外,为了防止缓冲区溢出,参数格式应该指定长度如“%80s”之类。
6、字符的I/O
#include <stdio.h>
int getc(FILE *stream);
int fgetc(FILE *stream);
int getchar(void);
int ungetc(int c, FILE *stream);
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
|
注意:getchar和putchar通常是由宏实现的,使用时可能会产生副作用。
7、字符串(不换行)的I/O
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
char *gets(char *s);
int fputs(const char *s, FILE *stream);
int puts(const char *s);
|
注意gets可能会引起缓冲区溢出,最好使用fgets来代替,fgets代替gets的最主要区别是fgets保留行终止符而gets不会保留。
8、文件的定位
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fops_t *pos);
void rewind(FILE *stream);
|
作用:fseek以whence模式把当前位置定位到流stream的offset处,whence包括SEEK_SET, SEEK_CUR, SEEK_END。
ftell返回当前位置(相对于文件起始位置)。
fgetpos和fsetpos则是ftell和fseek的变体。
rewind把stream的当前位置重置到起始处。
9、缓冲区控制
#include <stdio.h>
int fflush(FILE *stream);
int setbuf(FILE *stream, char *buf);
int setbuffer(FILE *stream, char *buf, size_t size);
int setlinebuf(FILE *stream);
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
|
作用:fflush强制把缓冲区中剩余的输入到stream流上。
setbuf、setbuffer和setvbuf都用于设置流所使用的缓冲区。其中setbuf功能比较弱,且不安全,可能会导致缓冲区溢出。setvbuf除了可以实现setbuffer的功能外还能设置缓冲区的模式:_IONBUF(无缓冲), _IOLBF(行缓冲), _IOFBF(完全缓冲)。改变流的缓冲模式只需要调用setvbuf并缓冲地址为NULL即可。
10、删除和重命名文件
#include <stdio.h>
int remove(const char *pathname);
int rename(const char *oldpath, const char *newpath);
|
执行成功返回0,失败返回-1并设置errno。
11、临时文件
ANSI C函数:
#include <stdio.h>
FILE *tmpfile(void);
char *tmpnam(char *s);
|
作用:fmpfile打开一个临时文件并返回其文件流指针。tmpname则为所给的缓冲区生成一个临时的文件名。它们只能在/tmp、/var/tmp之类下面创建临时文件。
POSIX C函数:
#include <unistd.h>
int mkstemp(char *template);
char *mktemp(char *template);
|
作用:mkstemp用模板指定路径,创建一个临时文件,并返回一个文件描述符。
12、目录操作
getcwd:返回当前目录
#include <unistd.h>
char *getcwd(char *buf, size_t size);
|
作用:把当前目录的绝对地址保存到buf中,buf的大小为size。如果size太小无法保存该地址,返回NULL并设置errno为ERANGE。可以采取零buf为NULL并使size为负值来使getcwd调用malloc动态给buf分配,但是这种情况要特别注意使用后释放缓冲以防止内存泄漏。
chdir、fchdir:改变当前目录
#include <unistd.h>
int chdir(const char *path);
int fchdir(int fd);
|
mkdir:创建目录
#include <fcntl.h>
#include <unistd.h>
int mkdir(const char *pathname, mode_t mode);
|
作用:以mode为模式创建pathname目录。成功返回0,失败返回-1并设置errno。
rmdir:删除空目录
#include <unistd.h>
int rmdir(const char *pathname);
|
删除空目录pathname,成功返回0,失败返回-1并设置errno。
13、获得目录列表:
#include <dirent.h>
#include <sys/types.h>
DIR *opendir(const char *pathname);
struct dirent *readdir(DIR *dir);
int rewinddir(DIR *dir);
int closedir(DIR *dir);
|
作用:opendir打开一个目录文件并返回DIR流指针。指针指向DIR的初始位置。出错返回NULL并设置errno。
readdir通过移动DIR指针读取目录内容到dirent结构,出错或者读取到末尾时返回NULL。其中文件名保存在dirent.d_name[]中。
rewinddir把DIR指针重新定位到初始位置。
closedir关闭DIR流指针。
阅读(1494) | 评论(0) | 转发(0) |