Linux文件

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;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值