C Linux File API小结

Posted on 2014-12-01


看完《Linux程序设计》关于文件操作api部分的小结。

#底层文件访问

#include <unistd.h>

size_t // 实际写入字节数 
write(
	int fildes,
	const void *buf,
	size_t nbytes
);

把缓冲区buf的前nbytes个字节写入与文件描述符fildes关联的文件中

#include <unistd.h>

size_t // 实际读入字节数
read(
	int fildes,
	void *buf,
	size_t nbytes
);

从与文件描述符fildes相关联的文件里读入nbytes个字节的数据,并把它们放到数据区buf中

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int 
open(
	const char *path, 
	int oflags
);

int 
open(
	const char *path, 
	int oflags, 
	mode_t mode // oflags使用O_CREATE时,必须设定此参数
);

访问文件

#include <unistd.h>

int 
close(
	int fields
);

终止文件描述符fildes与其对应文件之间的关联

#include <unistd.h>

int 
ioctl(
	int fildes,
	int cmd,
	...
);

系统调用

#include <unistd.h>
#include <sys/types.h>

off_t // 从文件头到文件指针被设置处的字节偏移值,失败时返回-1
lseek(
	int fildes,
	off_t offset,
	int whence
);

设置读写指针

#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

int 
fstat(
	int fildes, 
	struct stat *buf
);

int stat(
	const char *path, 
	struct stat *buf
);

int lstat(
	const char *path, 
	struct stat *buf
);

fstat系统系统调用返回与打开的文件描述符相关的文件的状态信息,该信息将会写到一个buf结构中,buf的地址以参数形式传递给fstat

stat和lstat返回通过文件名查找到的状态信息,但当文件是符号链接时,lstat返回的是符号链接本身的信息,而stat返回的是该链接指向的文件的信息

#include <unistd.h>

int 
dup(
	int fildes
);

int 
dup2(
	int fildes, 
	int fildes2
);

复制文件描述符

标准I/O库

在标准I/O库中,与底层文件描述对应的是流(stream),它被实现为指向结构FILE的指针。 在stdio.h里定义的stdin、stdout和stderr分别代表着标准输入、标准输出和标准错误输出,与底层文件描述符0、1和2系相对应。

#include <stdio.h>

FILE * // 失败时返回NULL
fopen(
	const char *filename, 
	const char *mode // e.g,"r"或"rb"代表只读方式
);

打开文件流

#include <stdio.h>

size_t // 成功读到数据缓冲区里的记录个数,当到达文件尾时候,可能小于nitems甚至可以是零
fread(
	void *ptr, 
	size_t size, // 置顶每个数据记录长度
	size_t nitmes, // 要传输的记录个数
	FILE *stream
);

从文件流读取数据

#include <stdio.h>

size_t // 成功写入的记录个数
fwrite(
	const void *ptr,
	size_t size,
	size_t nitems,
	FILE *stream
);

从指定的数据缓冲区读书记录,并把它们写到输出流

#include <stdio.h>

int 
fclose(
	FILE *stream
);

关闭指定的文件流

#include <stdio.h>

int 
fflush(
	FILE *stream
);

把文件流里的所有未写数据立刻写出,fclose函数隐含执行了一次flush操作

#include <stdio.h>

int // 0表示成功,-1表示失败并设置errno指出错误
fseek(
	FILE *stream,
	long int offset, 
	int whence
);

为下一次读写操作置顶指定位置

#include <stdio.h>

int // 到达文件尾部或出错时返回EOF
fgetc(
	FILE *stream
);

int 
getc( // 作为宏定义实现
	FILE *stream
);

int 
getchar(); // 相当于getc(stdin),从标准输入读取下一个字符

从文件流中读取下一个字节并把它作为一个字符返回

#include <stdio.h>

int
fputc(
	int c, 
	FILE *stream
);

int
putc( // 作为宏定义实现
	int c,
	FILE *stream
);

int 
putchar( // 相当于putc(c, stdout)
	int c
);

向文件流写入一个字符

#include <stdio.h>

char *
fgets(
	char *s,
	int n,
	FILE *stream
);

char *
gets( // 对传输字符的个数并没有限制,所以它可能会溢出自己的缓冲区
	char *s
);

从输入文件流读取一个字符串

格式化输入和输出

#include <stdio.h>

int 
printf(
	const char *format, 
	...
);

int 
sprintf(
	char *s,
	const char *format, 
	...
);

int
fprintf(
	FILE *stream,
	const char *format
	...
);

格式化输出

#include <stdio.h>

int 
scanf(
	const char *format,
	...
);

int
fscanf(
	FILE *stream,
	const char *format,
	...
);

int
sscanf(
	const char *s,
	const char *format,
	...
);

格式化输入

#include <errno.h>

extern int errno;

此外部变量指出stdio函数的错误,应该总是在使用它之前将它复制到另一个变量中,因为像fprintf这样的输出函数本身就可能改变errno的值

#include <stdio.h>

int 
ferror(
	FILE *stream
);

测试一个文件流的错误标识,如果该标识设置就返回一个非零值,否则返回0

#include <stdio.h>

int 
feof(
	FILE *stream
);

测试一个文件流的文件尾标识,如果该标识被设置就返回非零值,否则返回零

#include <stdio.h>

int 
clearerr(
	FILE *stream
);

清除由stream指向的文件流的文件尾标识和错误标识

文件和目录

#include <sys/stat.h>

int 
chmod(
	const char *path, 
	mode_t mode
);

改变文件或目录的访问权限

#include <sys/types.h>
#include <unistd.h>

int 
chown(
	const char *path, 
	uid_t owner, 
	gid_t group
);

改变文件属主

#include <sys/types.h>
#include <sys/stat.h>

int
mkdir(
	const char *path,
	mode_t mode
);

建立目录

int
rmdir(
	const char *path
);

删除目录

#include <unistd.h>

int
chdir(
	const char *path
);

切换目录

#include <unistd.h>

char *
getcwd(
	char *buf,
	size_t size
);

获取当前目录

#include <sys/types.h>
#include <dirent.h>

DIR * // 失败时返回空指针
opendir(
	const char *name
);

打开一个目录并建立一个目录流

#include <sys/types.h>
#include <dirent.h>

struct dirent *
readdir(
	DIR *dirp
);

readdir函数返回一个指针,该指针指向的结构里保存着目录流dirp中下一个目录项的有关资料

#include <sys/types.h>
#include <dirent.h>

long telldir(DIR *dirp);

telldir函数的返回值记录着一个目录流里的当前位置

#include <sys/types.h>
#include <dirent.h>

void
seekdir(
	DIR *dirp,
	long int loc
);

设置目录流dirp的目录项指针

#include <sys/types.h>
#include <dirent.h>

int 
closedir(
	DIR *dirp
);

关闭一个目录流

错误处理

#include <string.h>

char *
strerror(
	int errnum
);

把错误代码隐射为一个字符串

#include <stdio.h>

void 
perror(
	const char *s
);

把errno变量中报告的当前错误隐射到一个字符串,该字符串先加上字符串s,再加上一个冒号和一个空格,e.g:

perror("errormsg");

// 可能输出"errormsg: Too many open files"