# LINUX系统下的基本文件操作

LINUX系统提供的一系列的API

打开 open

函数原型
int open(const char *pathname, int flags)
int open(const char *pathname, int flags, mdre_t mode);
参数说明
pathname:是一个字符串 代表要打开的文件名(含路径,缺省为当前路径)
flags:
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 可读可写打开
当我们附带了权限后,打开的文件就只能按照这种权限来操作。
以上这三个常数中应当只指定一个。下列常数是可选择的:
O_CREAT 若文件不存在则创建它。使用此选项时,需要同事说说明第三个参数mode,用其说明该新文件的存取许可权限。
O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。
O_APPEND 每次写时都加到文件的尾端。
O_TPUNC 属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或者只写成功打开,则将其长度截断为0。
Mode:
一定是在flags中使用了O_CREAT标志,mode记录待创建文件的访问权限
文件执行的权限
可读 r 2 0200
可写 w 4 0400
可执行 x 1 0100
可读可写r+w 0600

函数执行成功:新打开的文件描述符
失败:-1
open返回的文件描述符一定是最小的而且没有被使用的

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
        int fd;
        fd=open("./file1",O_RDWR);

        if(fd==-1){
                printf("filke open faile\n");
                 fd=open(".file1",O_RDWR|O_CREAT,0600);
         if(fd>0){
                printf("creat file1 success\n");
                }


        }

        return 0;
}

读写 read/write

write有两种用法。一种是:ssize_t write(int fd, const void buf, size_t nbyte);
fd:文件描述符;
buf:指定的缓冲区,即指针,指向一段内存单元;通常是一个字符串,需要写入的字符串
nbyte:要写入文件指定的字节数;
返回值:写入文档的字节数(成功);-1(出错)
write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.
另一种是: write(const char
str,int n)
str是字符指针或字符数组,用来存放一个字符串。n是int型数,它用来表示输出显示字符串中字符的个数。
write(“string”,strlen(“string”);表示输出字符串常量

read
ssize_t read(int fd,void*buf,size_t count)
参数说明:
fd: 是文件描述符
buf: 为读出数据的缓冲区;
count: 为每次读取的字节数(是请求读取的字节数,读上来的数据保
存在缓冲区buf中,同时文件的当前读写位置向后移)
成功:返回读出的字节数
失败:返回-1,并设置errno,如果在调用read
之前到达文件末尾,则这次read返回0

提示:无论是读文件还是写文件 光标都会跟着内容移动 且不会自动返回 所以要注意文件光标的位置
可以用close函数重新打开让光标恢复到开头 也可以用lseek函数来定位

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>

int main()
{
        int fd;
        char *buf="shi huai zhong hen shuai";
        fd=open("./file1",O_RDWR);

        if(fd==-1){
                printf("filke open faile\n");
                 fd=open("./file1",O_RDWR|O_CREAT,0600);
         if(fd>0){
                printf("creat file1 success\n");
                }


        }
                printf("open sucess fd=%d\n",fd);

                write(fd,buf,strlen(buf));
                close(fd);


        return 0;
}
~      

光标定位 lseek

Linux的lseek函数用来控制一个打开的文件的读写位置,它的函数原型如下:
off_t lseek(int fildes,off_t offset ,int whence);
参数的用法:fildes参数为一个已打开的文件描述符;参数offset为读写位置的位移数,这个位移数是根据参数whence来确定的;whence参数分为下列三种:
SEEK_SET:表示offset用来直接设置读写位置。
SEEK_CUR:表示以目前的读写位置往后增加offset个位移量。
SEEK_END:表示将读写位置指向文件尾后再增加offset个位移量。
当whence值为SEEK_CUR或SEEK_END时,参数offet允许负值出现。当lseek调用成功时返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno会存放错误代码。下面是几个使用示例:
将读写位置移到文件开头:lseek(myfile, 0, SEEK_SET);
将读写位置移到文件尾:lseek(myfile, 0, SEEK_END);
想要取得目前文件位置:off_t cur=lseek(myfile, 0, SEEK_CUR);
注意:使用lseek函数需要包含以下头文件:
#include <sys/types.h>
#include <unistd.h>
偏移值为负数时表示向前移动 为正向后移动 该函数的返回值是文件的偏移值

关闭 close

关闭文件close(fd);
fd 已打开文件的描述符

创建 creat

定义函数:int creat(const char * pathname, mode_tmode);

函数说明:
1、参数 pathname 指向欲建立的文件路径字符串。
2、Creat()相当于使用下列的调用方式调用open()
open(const char * pathname, (O_CREAT|O_WRONLY|O_TRUNC));

 filename:要创建的文件名(包括路径,默认当前路径)

 mode:创建模式,指定用户操作权限(针对三种用户设置:所处用户,所处用户组,其他用户

                           权限:读,写,执行)

(0表示没有任何权限

 S_IRUSR可读,1

 S_IWUSR可写,2

 S_IXUSR可执行,4

S_IRWXR可读、写、执行)7(也可以用数字代替,如0777)

返回值:文件描述符,值为一个整数,发生错误时返回-1

返回值:
creat()会返回新的文件描述词, 若有错误发生则会返回-1, 并把错误代码设给errno.

错误提示:
EEXIST参数:pathname 所指的文件已存在.
EACCESS参数:pathname 所指定的文件不符合所要求测试的权限
EROFS:欲打开写入权限的文件存在于只读文件系统内
EFAULT参数:pathname 指针超出可存取的内存空间
EINVAL参数:mode 不正确.
ENAMETOOLONG参数:pathname 太长.
ENOTDIR 参数:pathname 为一目录
ENOMEM :核心内存不足
ELOOP 参数:pathname 有过多符号连接问题.
EMFILE:已达到进程可同时打开的文件数上限
ENFILE:已达到系统可同时打开的文件数上限

什么是文件描述符

1,对于内核而言,所以打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或者创造一个新文件时,内核向进程返回一个文件描述符。当读写一个文件时,用open和creat返回的文件描述符标识该文件,将其作为参数传递给read和write
按照惯例,UNIX shell使用文件描述符0与进程的标准输入相结合,文件描述符1与标准输出相结合。STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO这几个宏代替了0.1.2这几个魔数。
2,文件描述符,这个数字在一个进程中表示一个特定含义,当我们open一个文件时,操作系统在内存中构建了一些数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数字就和我们内存中维护的这个动态文件的数据结构当定上了,以后我们应用程序如果要操作这个动态文件,只需要用这个文件描述符区分。
3.文件描述符的作用域就是当前进程,出了这个进程文件描述符就没有意义了
open函数打开文件,打开成功返回一个文件描述符,打开失败,返回-1

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
        int fd;
        char readBuf[128];

        int n_read=read(0,readBuf,5);

        int n_write=write(1,readBuf,5);

        printf("done\n");
        return 0;
}
可以用默认描述符完成系统从键盘上获取输入输出的操作。
## 标准C库下的文件API
[open与fopen的区别总结](https://www.cnblogs.com/NickyYe/p/5497659.html)
[fopen的使用方法](http://c.biancheng.net/view/2054.html)
fopen fread fwrite fseek
fgetc 获取文件中的内容
 fputc 给文件输入内容
  feof 判断是否读取到文件的尾巴
[fgetc fputc feof](https://www.runoob.com/cprogramming/c-function-fgetc.html)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值