Linux文件中:“一切皆为文件”;在Linux中对目录和设备的操作都等同于对文件的操作,都是使用文件描述符来进行的。
Linux文件可分为:普通文件,目录文件,链接文件,设备文件;
创建:
int creat(const char *filename, mode_t mode )
filename :创建的文件名(包含路径,缺省为当前路径)
mode:创建模式
常创建模式:
S_IRUSR 可读
S_IWUSR 可写
S_IXUSR 可执行
S_IXRWU 可读、可写、可执行
除用以上宏来选择创建模式,也可以用数字来表示
打开:
open函数是用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。
#include <sys/types.h> //头文件部分可以用man手册查看
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
参数:
pathname是要打开或创建的文件的名字
flags参数可用来说明此函数的多个选择项
mode对于open函数而言,仅当创建新文件时才使用第三个参数
返回值:成功返回新分配的文件描述符,
出错返回-1并设置errno
flags:
以下可选项可以同时指定0个或多个, 和必选项按位或起来作为flags参数。
O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件的存取权限。
O_NONBLOCK 如果pathname指的是一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。
mode参数:
以下三个常数中必须指定一个,且仅允许指定一个(这些常数定义在<fcntl.h>头文件中)
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读、写打开
关闭文件
当我们操作完文件以后,需要关闭文件:
int close(int fd)
读:
int read(int fd, const void *buf, size_t length)
功能:从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取的字节数。
写:
int write(int fd, const void * buf, size_t length)
功能:把length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。
定位:
int lseek(int fd, offset_t offset, int whence)
功能:将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置
whence可使用下述值:
SEEK_SET:相对文件开头
SEEK_CUR:相对文件读写指针的当前位置
SEEK_END:相对文件末尾
offset可取负值,表示向前移动。例如下述调用
可将文件指针相对当前位置向前移动5个字节:
lseek(fd, -5, SEEK_CUR)
/*****************************************************
> File name: write.c
> Author: Mr.YUAN
> 日期: 2017-12-05 13:51
*****************************************************/
#include <stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
char name[10];
int age;
char sex;
} Node;
int main()
{
int fd;
int ret;
int a;
Node stu = {"zhang",20,'f'};
fd = open("a.txt",O_RDWR | O_CREAT | O_EXCL);
if(-1 == fd)
{
perror("open");
exit(1);
}
ret = write(fd,&stu,sizeof(Node));
if(-1 == ret)
{
perror("write");
exit(1);
}
ret = lseek(fd,0,SEEK_SET);
if(-1 == ret)
{
perror("lseek");
exit(1);
}
ret = read(fd,&stu,sizeof(Node));
if(-1 == ret)
{
perror("read");
exit(1);
}
printf("%s %d %c",stu.name,stu.age,stu.sex);
printf("\n");
a = lseek(fd,0,SEEK_END);
if(ret == -1 )
{
perror("lseek");
exit(1);
}
printf("%d",a);
printf("\n");
return 0;
}