window和linux下文件操作总结

3 篇文章 0 订阅

以前做了个window移植到Linux中,涉及到了两种系统之间文件,线程,时间等内容的差异,今天就针对两种系统的文件操作进行总结;

文件操作是程序员最基本的需要掌握的知识,虽然知道一些,但是通过本编文章更深刻的进行掌握。

首先来看看Linux下的文件操作,都是可以通过man函数进行查看,今天把基本的操作列出来

1、我们都知道在Linux下,一切都是文件,文件操作进而可以分为两类:系统调用和库函数

在Linux下文件操作无非是open,close,read,write,lseek,通过这几个函数就可以实现对文件的读写等操作。

1.1 文件描述符

在进行文件操作的时候需要一个文件标识进行读写操作,这个标示就是文件描述符,也可以说是文件ID。一个文件ID在系统中唯一标识一个文件。

在系统开始启动的时候,就打开了三个文件描述符

0 ----标准输入

1 ----标准输出

2 ----标准错误

1.2 open函数

open顾名思义就是打开一个文件,并返回文件的描述符

在Linux下终端内,直接man open就可以找到open的规范描述,在描述中有两个介绍:

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


       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);

前面是open函数调用应该具有的头文件

参数说明:

path:准备打开的文件或设备名字;

flags:打开文件的访问模式;

访问模式可以是O_RDONLY 只读, O_WRONLY 只写, O_RDWR 可读可写;

还可以包括O_APPEDN 把写入的数据追加到文件末尾, O_CREAT但文件没有时,根据mode权限建立文件,这些模式可以通过位或进行组合; 

 mode:就是当使用 O_CREAT时,建立的文件所具有的权限;

S_IRUSR:读权限,文件所有者

S_IWUSER:写权限,文件所有者

。。。

为了方便,这些文件权限可以通过数字进行配置,和chmod赋予权限的类型相同。

open调用成功返回0,失败返回-1.

如:

open("my.file", O_RDWD|O_CREAT, 0666);

赋予文件my.file所有者,所有组,其他可读可写权限。

一个小例子:


进行编译,运行发现my.file的权限不对


这是什么原因呢?

以为系统有默认的权限,这是umask在搞怪。

当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认 权限,它与chmod的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。

umask是一个函数,我们可以在代码中添加umask(0000),进行设置下,就可以了,我们试一下看看

加上了,果然没有问题了,你们也可以试试

1.3 close函数

这个函数很简单,先看看man close

       #include <unistd.h> 

int close(int fd);

close成功返回0, 失败返回-1

1.4 write函数

write将缓冲区中的数据写入文件,函数原型是:

ssize_t write(int fd, void *buf, size_t count);

参数说明:

fd:文件描述符;

buf:待写入的文件指针;

count:写入的字节数。

返回值:

返回成功写入的字符数,错误返回-1

1.5 read函数

       #include <unistd.h>
       ssize_t read(int fd, void *buf, size_t count);

参数和上面的write对应,这里就不写了。

返回值:返回成功读取的字符数。

小例子:


1.6 lseek函数

      lseek针对文件的偏移。

       #include <sys/types.h>
       #include <unistd.h>
       off_t lseek(int fd, off_t offset, int whence);

参数:

fd:文件描述符;

offset:针对文件的偏移,是根据whence的偏移,可正可负;

whence:文件便宜的开始位置;

SEEK_SET:文件开始位置

SEEK_CUR:文件当前位置

SEEK_END:文件结尾

返回:成功返回文件的偏移,失败返回-1.

我们直接可以采用lseek,获取文件的长度:

int file_len = lseek(fd, 0, SEEK_END);

2.window下的文件操作

简单介绍下window下的文件操作,这里面涉及内容很多

2.1 fopen函数

#include <stdio.h>

FILE * fopen(const char * path , const char * mode);

path:文件的路径;

mode:打开的流模式。

r:只读;

w:只写;

r+:更新方式读写打开;

w+:更新方式读写打开,并把文件长度截断为0;

a+:更新方式打开,并将内容追加在文件尾。

2.2 fwrite

size_t fwrite(const void *buf, size_t size, size_t count, FILE* stream);

buf:数据的指针;

size:写入的内容的单字节数;

count:写入字节数据项的个数;

stream:写入为文件流指针。

返回值:写入的数据项的个数

实际就是写入了count * size的大小内容

2.3 fread

size_t fread(const void *buf , size_t size, size_t count, FILE *stream);

这个和fwrite对应。

2.4 fclose

fclose(FILE *stream);

2.5 fseek

fseek是lseek系统调用对应的文件流函数。

int fseek(FILE *stream, long offset, int fromwhere);

这个和lseek相对应,就不详细说了。

例子就不弄了,关于这方面的内容很多,相信你们早已理解,这太简单了。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值