IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Linux文件编程 -> 正文阅读

[C++知识库]Linux文件编程

文件权限

①可读 r
②可写 w
③可执行 x
也可用数字表示:r=4,w=2,x=1。所以7=rwx

ls -l    //查看当前目录文件属性

运行结果如下:

-rwxrw-r-- 1 xdq book 1 Sep  7 16:41 read.c

10个字符用于确定不同用户权限。共分为四个部分:类型、文件所有者、文件所有者同组用户、其他用户。

  • 第一个字符代表文件(-)、目录(d),链接(l)
  • 第一组rwx:文件所有者的权限是可读可写可执行
  • 第二组rw-:文件所有者同组用户的权限是可读可写
  • 第三组r–:其他用户的权限为仅可读

文件描述符

1.对内核来说,所有打开文件都是用文件描述符引用。fd是一个非负整数,当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当读写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传递给read和write。Linux系统包括的默认文件描述符:

0标准输入   
1标准输出    
2标准错误
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
        char readBuf[128];

        read(0,readBuf,5);
        write(1,readBuf,strlen(readBuf));
        printf("\n");

        return 0;
}

2.文件描述符这个数字在一个进程中表示一个特定的含义。当open一个文件时,操作系统在内存中构建了数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数字就和内存中的动态文件的数据绑定。后续操作动态文件,只需要用这个文件描述符区分。

3.文件描述符的作用域是当前进程。open函数打开文件成功返回一个文件描述符,失败返回-1。

linux文件操作基本流程

①打开/创建文件
②读/写文件
③关闭文件

文件操作解析

1.先使用open函数打开文件,打开成功得到文件描述符,然后对文件进行读写(或其他)操作,最后使用close函数关闭文件,若不关闭文件会造成文件损坏。

2.文件存放在块设备文件系统中,称为静态文件。打开文件时,内核在进程中创建数据结构(结构体)记录打开的文件;同时申请一段内存将静态文件的内容从块设备中提取到内核中的特定地址存放管理(动态文件)。

3.打开文件后对文件的操作都是针对动态文件进行操作。对动态文件操作完成后,动态文件与静态文件的内容并不匹配,关闭文件时内核将动态文件的内容更新到静态文件中。

4.为何这样操作?
块设备对块进行操作,内存对字节进行操作。进行修改时,只能对整个块进行操作,无法对单个字节进行操作。

打开/创建文件(open)

函数原型:

参数说明:
pathname:打开/创建的文件名字(含路径)
flags:打开文件的操作方式

主类:
O_RDONLY    只读
O_WRONLY    只写
O_RDWR      可读可写        //三者只可选其一

副类:
O_CREAT     如果文件不存在则创建该文件
O_EXCL      如果使用O_CREAT选项且文件存在,则返回错误消息(-1)  
O_TRUNC     如果文件已经存在则删除文件中原有数据
O_APPEND    以追加的方式打开,加到文件的尾端
O_NOCTTY    如果文件为终端,那么终端不可以调用open系统调用的那个进程的控制终端

mode:创建文件时的文件权限
返回值:
成功返回文件描述符,失败返回-1
实例:

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

int main()
{
        int fd;
        fd = open("./file1",O_RDWR|O_CREAT,0600);
 		printf("fd = %d\n",fd);
        if(fd == -1){
                printf("error!\n");
                exit(-1);
        }

        return 0;
}

运行结果:

fd = 3
-rw------- 1 xdq book    0 Sep  7 17:21 file1     //通过ls -l查看

关闭文件(close)

对文件进行操作(读写)时,操作完成都需要关闭文件,否则会造成文件损坏。
函数原型:
在这里插入图片描述
参数说明:
fd:文件描述符

写文件(write)

函数原型:
在这里插入图片描述
参数说明:
fd:文件描述符
buf:存放写入内容的缓冲区
count:写入的字节数
返回值:
没有写入内容返回-1 ,成功写入返回字节数

  • 注意:如果文件中有内容,且打开文件时没有进行处理,则会覆盖原来的内容

读文件(read)

函数原型:
在这里插入图片描述
参数说明:
fd:文件描述符
buf:存放读取内容的缓冲区
count:读取的字节数
返回值:
成功读取返回读取的字节数,若光标在文件结尾返回0,失败则返回-1

文件光标偏移(lseek)

对文件进行读写操作时,光标会不断偏移。当写入内容后,光标偏移至文件尾,此时读取不到内容,需要将光标移动到文件头才能正常读取。
函数原型:
在这里插入图片描述
参数说明:
fd:文件描述符
offset:偏移值(偏移的字节数,offset可以是负值。正值向后偏移,负值向前偏移)
whence:偏移基础位置(在这个基础上偏移offset个字节)

whence为以下其中一种:
SEEK_SET 文件头
SEEK_CUR 文件当前位置
SEEK_END 文件尾

返回值:
成功返回偏移值,失败返回-1

综合实例

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

int main()
{
        int fd;
        ssize_t n_write;
        ssize_t n_read;
        char *writeBuf = "hello world!";
        char *readBuf;

        //打开/创建文件
        fd = open("./file1",O_RDWR|O_CREAT,0600);
        printf("fd = %d\n",fd);
        if(fd == -1){
                printf("error!\n");
                exit(-1);
        }

        //写文件
        n_write = write(fd,writeBuf,strlen(writeBuf));
        printf("n_write = %d\n",(int)n_write);

        //光标偏移
        lseek(fd,0,SEEK_SET);

        //读文件
        readBuf = (char *)malloc(n_write);
        n_read = read(fd,readBuf,n_write);
        printf("n_read = %d   txt:%s\n",(int)n_read,readBuf);

        //关闭文件
        close(fd);
        
        return 0;
}

运行结果:

fd = 3
n_write = 12
n_read = 12   txt:hello world!
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-08 10:29:29  更:2021-09-08 10:31:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:18:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码