文件描述符
非负整数
定义形式
int fd;
标准文件描述符定义
STDIN_FILENO(0)
STDOU_FILENO(1)
STDERR_FILENO(0)
文件操作的一般过程
打开-读/写/-[定位]-关闭
出错处理
UINX风格
返回值
"errno"变量(“/usr/include/errno.h”)
strerror
#include<string.h>
char *strerror(int errnum);
返回出错的字符串描述
perror()
#include<stdio.h>
void perrpr(const char *msg);
打印错误原因字符串
open()/creat()
功能
打开或创建一个文件或设备
头文件
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
函数原型
int open(const char *pathname,int flags);
int open(const char *path)
int creat (const char *pathname,mode_t mode);
返回值
成功时返回新文件描述符
否则返回-1
参数flags说明
功能
文件访问模式
取值说明(/usr/include/fcntl.h)
O_RDONLY:只读形式打开
O_WRONLY:只读形式打开
O_RDWR:读写形式打开
o_APPEND:追加模式打开
O_TRUNC:若文件存在且为只读或只写成功打开,则长度为0
O_CREAT:若文件不存在则创建
使用此选项时,需同时说明参数mode说明文件的存取许可权位
O_EXCL:若同时指定O_CREAT,而文件已经存在,则出错
该参数可测试文件是否存在,如果不存在则创建此文件
creat()函数说明
等价于已参数O_CREAT|O_WRONLY|O_TRUNC执行open()
read()/write()系统调用
read()
功能
从文件描述符读取数据
头文件
#include<unistd.h>
函数原型
ssize_t read(int fd,void *buf,size_t count);
返回值:读到的字节数,若已到文件尾为0,若出错为-1
write()
功能
将数据写入文件描述符
头文件
#inclde<unistd.h>
函数原型
ssize_t write(int fd,const void *buf ,size_t count)
返回值:若成功为已写的字节数,若出错为-1
close()
功能
关闭文件描述符
头文件
#include<unistd.h>
函数原型
int close(int fd)
成功:返回0
失败:返回-1
lseek()
功能
调节读写的偏移量
头文件
#include<sys/types.h>
#include<unistd.h>
函数原型
off_t lseek(int fildes,off_t offset,int whence);
返回值
成功时返回偏移量
否则返回-1
whence说明
SEEK_SET:从文件开始的偏移量
SEEK_CUR: 从当前位置开始加offset后的偏移量
SEEK_END:从文件末开始加offset后的偏移量
duo()系统调用
功能
复制文件描述符
头文件
#include<unistd.h>
函数原型
int dup(int oldfd);
传给该函数一个现有描述符,和目标描述符
目标描述符将变成源描述符的复制品。即两个文件描述符指向同一文件,且时源描述符指向的文件
返回值
成功时返回新文件描述符
否则-1
dup2()
函数原型
int dup2(int oldfd,int newfd);
fcntl()
功能
根据文件描述符来操作文件的特性
头文件
#include<unistd.h>
#include<fcntl.h>
函数原型
int fcntl(int fd,int cmd);
int fcntl(int fd, int cmd,long arg);
int fcntl(int fd,int cmd,struct flock *lock);
参数说明
fd :文件描述符
cmd :操作命令
arg :命令使用参数
lock: 命令使用的参数
返回值
若成功,则依赖于cmd
若出错 -1
cmd参数说明
F_DUPFD: 复制文件描述符
FD_CLOEXEC:设置close-on-exec标致
F_GETFD:读取文件描述符标志
F_SETFD:设置文件描述符标志
F_GETFL:读取文件状态标志
F_SETFL:设置文件状态标志
F_GETLK:获取记录锁
F_SETLK:释放记录锁
F_SETLKW:测试记录锁
## 缓存I/O
缓存文件系统为每个正在被使用的文件在内存开辟文件信息区
文件信息用FLIE结构体描述
Stream及"FILE"结构
FLIE *fp;
typedef struct
{
int cnt; //余下的字符数
char *ptr; //下一个字符的位置
char *base; //缓冲区的地址
int flag; //存取方式
int fd; //文件描述符
}FLIE;
预定义指针
extern FLIE *stdin;
extern FLIE *stdout;
extern FLIE *stderr;
文件类型指针
指针变量说明
FLIE *fp;
用法
文件打开时,系统自动建立文件结构体
返回指向它的指针,程序通过这个指针获得文件信息,访问文件
文件关闭后,文件结构体被释放
fopen()函数
功能
打开文件流
头文件
#include<stdio.h>
函数原型
FILE *fopen(const char *filename.const char *mode);
mode参数说明
“r”: 以读方式打开文本文件
“w”:以写方式创建一个文件,覆盖老文件
“a”: 以追加方式打开文件
“r+”:以读方式打开一个现存文件
“w+”:以读写方式打开一个文件
若不存在,将创建
若存在,将覆盖原文件
“a+”:以读及追加方式打开文件,若不存在,将创建之
“b”:以二进制模式打开文件
“t”:以文本模式打开文件
fclose()函数
功能
关闭文件流
头文件
#include<stdio.h>
函数原型
int fclose(FILE *stream)
返回值
成功时返回0
否则-1
输入字符
头文件
#include<stdio.h>
函数原型
int fgetc(FLIE *fp)
从文件流中读取下一个字节,并作为字符返回
到达文件尾或出现错误时,放回EOF
int getc(FLIE *fp);
与fgetc()功能类似,但可实现称一个宏
int getchar(void)
相当于getc(stdin)
输出字符
头文件
#include<stdio.h>
函数原型
int fputc(int c,FILE *fp);
向输出文件流写入一个字符
int putc(int c,FILE*fp);
int putchar(int c);
相当于put(c,stdout)
返回值
成功时返回写入的字符ASC码值
否则放回-1
int feof(FLIE *fp)
功能
判断文件是否结束
返回值
文件结束,返回真(非0),文件为结束,返回0
while(!feof(fp))
{
ch=fgetc(fp);
}
输入一行字符串
头文件
#include<stdio.h>
函数原型
char *fgets(char *s,int size ,FILE* STREAM);
/*最多读取size-1个字符,并保存在S中
遇到EOF或者新行时读操作结束
'\0'保存在S的末尾
*/
char *gets(char *s);
//类似fgest(),但从标准读入读取数据并丢遇到的换行符号
返回值
成功返回指向字符串S的指针
失败返回NULL
输出一行字符串
头文件
#include<stdio.h>
函数原型
int fputs(const char *s,FILE*stream);
int puts(const char *s);
返回值
如果写入成功,则返回非0(不是写入的字节数,仅仅是个非零值)次时编辑器默认为返回1
如果写入错误,则返回EOF
注意
puts会自动在输入的字符串末尾加入回车符
FILE *fp;
char string[81];
if((fp=fopen("file.txt","w"))==NULL){
printf("cann't open file");exit(0);
}
while(strlen(gets(string))>0) {
fputs(string,fp);
fputs("\n",fp);
}
fclose(fp);
if((fp=fopen("file.txt","r"))==NULL){
printf("cann't open file");
exit(0);
}
while(fgets(string,81,fp)!=NULL)
puts(string);
fclose(fp);
}
格式化I/O
头文件
#include<stdio.h>
函数原型
int fprintf(FILE *fp,const char *format,...)
int fscanf(FILE *fp,const char *format,...)
功能
按格式对文件进行I/O操作
返回值
成功,放回I/O操作
出错或文件尾,返回EOF
fprintf(fp,"%d,%6.2f",i,t)
//将i和t按%d和%6.2f格式输出到fp文件
fscanf(fp,"%d,%f",&i,&t)
//若文件中有 3,4,5,则将3送如i,4.2送入
printf("%d,%6.2f",i,t)
//将i和t按格式%d和%6.2f输出到屏幕
scanf("%d,%f",&i,&t);
//若键盘输入为3,4,5 则将3送入i,4.5送入t
取指定长度的字符串
char s[80],c[80];
int a,b;
FILE *fp;
if(fp=fopen("test","w")==NULL){
puts("can not open file");
exit();
}
scanf("%s%d",s,&a);
fprintf(fp,"%s %d",s,a);
fclose(fp);
if((fp=fopen("text","r"))==NULL){
puts(
"can't open file");
exit();
}
fscanf(fp,"%s%d",c,&d);
printf("%s%d",c,b);
fclose(fp);
}