文件操作
(一)、文件类型:d:目录,l:链接,c:字符设备、d:块设备、p:管道文件、s:共享文件(二)、文件描述符:
特点:1、文件描述符是一个非负整数 2、文件描述符是动态分配的 3、获得文件描述符之后,对文件描述符操作就相当于对文件操作 4、文件描述符从3开始
(三)、API接口:
1、create:
函数原型:create(const *pathname,mode_t mode);
头文件:#include <sys/types.h> #include <sys/stat.h> #include <sys/fcntl.h>
范例:create ("a.txt",S_IRUSR);(第二个参数可加ctrl +n补齐)
可读可写:S_IRUSR | S_IWUSR 可同时具备两个属性
特点:create会覆盖,但不会修改权限
设定创建文件夹名称:
char file_name[10];
scanf("%s\nb",file_name);
create(file_name,0655);
也可以由终端命令行输入:
int main(int argc,char *argv[])
{
if(argc != 2)
{
printf("error!\n);
exit(1);
}
create(argv[1],0655);
return 0;
}
createAPI成功返回一个文件描述符,错误返回-1并且置入errno
例子:
int fd = create(argv[1],0655);
if(fd == -1)
{
perror("create error!\n");
exit(1);
}
使用perror要加头文件#include <error.h>
如果有下面这种方式发出警告,是不可行的:
if(fd == -1 && errno == ENOTDIR)
{
printf("create error!\n");
exit(1);
}
因为errno是全局变量,它的值可能被修改
可以修改为:printf("create error:%s\n",strerror(errno));
perror不可打印变量值
2、open
函数原型:int open(const *pathname, int flag)
flag:O_RDNLY O_WONLY O_RDWR O_APPEND可追加
例子:
open(argv[1],O_RDWR);
返回值:成功则返回文件描述符,失败返回-1
假设返回的文件描述符是4,则对4操作就是对文件操作
如果没有这个文件则:fd = open("hello.c",O_RDWR | O_CREATE,0655);
权限修改为没有文件就创建,所以以后不用create,直接用open;
3、close:
close(fd);
4、write:
例子:换行写入:
int i;
char buf[100];
for(i = 0; i < 3; i++)
{
memset(buf,0,sizeof(buf));
scanf("%s",buf);
write(fd,buf,strlen(buf));
write(fd,"\n",1);
}
5、read
原型:read(int fd,void *buf,sizeof_t count)
例子:使用上例文件内容读取:
int r_len= read(fd,buf,sizeof(buf));
if(r_len == -1)
{
perror("read error!\n");
exit(1);
}
6、文件读写位置:
将指针移到刚开始的读写位置:lseek(int fildes,off_t offset, int whence);
whence : SEEK_SET 文件开头 SEEK_CUR 当前位置 SEEK_END 文件末尾
例子:lseek(fd,18,SEEK_END); 相对于文件末尾位移18
lseek返回值:错误返回-1,正确返回文件指针距离文件开头位置的长度
7、fopen:
函数原型:FILE *fopen(const char *path,char *mode);
例子:FILE *fp = fopen(argv[1],"a+");
if(fp == NULL)
{
printf("open error!\n");
exit(1);
}
8、fwrite:
返回值:实际写入多少字节
9、fread:
10、fseek
例子:fseek(fp,0,SEEK_SET);
11、fgetc和fputc