从Linux系统的角度看待文件-基础IO

目录

从Linux系统的角度看待文件

系统文件I/O

open

write

read

文件操作的本质

vim中批量注释的方法


从Linux系统的角度看待文件

关于文件的共识:

1.空文件也要占用磁盘空间

2.文件=内容+属性

3.文件操作包括文件内容/文件属性/文件内容+属性

4.文件路径+文件名具有唯一性

5.如果没有指明对应的文件路径,默认是在当前路径下对文件进行访问

故:文件操作的本质为:进程和被打开文件的关系

文件权限=0 666&~umask(默认文件掩码)

系统文件I/O

open

cpp 复制代码
#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);
 
pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行"或"运算,构成flags。
参数:
 O_RDONLY: 只读打开
 O_WRONLY: 只写打开
 O_RDWR : 读,写打开
 这三个常量,必须指定一个且只能指定一个
 O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
 O_APPEND: 追加写
返回值:
 成功:新打开的文件描述符
 失败:-1

write

cpp 复制代码
  #include <unistd.h>

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

c语言字符串以'\0'为结尾,与文件无关

cpp 复制代码
//r   w   r+(读写,不存在则报错)   w+(读写,不存在则创建)
    //FILE* fp=fopen(FINE_NAME,"");
    int fd=open(FINE_NAME,O_WRONLY|O_CREAT,0666);
    if(fd<0)
    {
        perror("open");
        return 1;
    }
    int cnt =5 ;
    char outBuffer[64];
    while (cnt)
    {
        sprintf(outBuffer,"%s:%d\n","test",cnt--);
        write(fd,outBuffer,strlen(outBuffer));//strlen 不能+1 算上'\0' 会出现乱码
    }
    
    //printf("fd: %d\n",fd);
    close(fd);
cpp 复制代码
int fd=open(FINE_NAME,O_WRONLY|O_CREAT|O_TRUNC,0666);

O_TRUNC:对文件内容做清空

read

cpp 复制代码
SYNOPSIS
       #include <unistd.h>

       ssize_t read(int fd, void *buf, size_t count);
cpp 复制代码
char buffer[1024];
    ssize_t num = read(fd,buffer,sizeof(buffer)-1);
    if(num>0) buffer[num]=0;
    printf("%s",buffer);

文件操作的本质

文件操作的本质为:进程和被打开文件的关系

进程可以打开多个文件-> 系统中存在大量的被打开的文件

OS管理被打开文件的方式是为其创建对应的内核数据结构(struct file)标识文件

struct file:中包含了文件的大部分属性。

cpp 复制代码
#define FINE_NAME(number) "log.txt"#number

#:的作用是为了将log.txt与number拼接起来

cpp 复制代码
int fd1 = open(FINE_NAME(1), O_WRONLY | O_CREAT | O_TRUNC, 0666);
    int fd2 = open(FINE_NAME(2), O_WRONLY | O_CREAT | O_TRUNC, 0666);
    int fd3 = open(FINE_NAME(3), O_WRONLY | O_CREAT | O_TRUNC, 0666);
    int fd4 = open(FINE_NAME(4), O_WRONLY | O_CREAT | O_TRUNC, 0666);
    int fd5 = open(FINE_NAME(5), O_WRONLY | O_CREAT | O_TRUNC, 0666);
printf("fd: %d\n", fd1);
    printf("fd: %d\n", fd2);
    printf("fd: %d\n", fd3);
    printf("fd: %d\n", fd4);
    printf("fd: %d\n", fd5);
    close(fd1);
    close(fd2);
    close(fd3);
    close(fd4);
    close(fd5);
cpp 复制代码
SYNOPSIS
       #include <stdio.h>

       extern FILE *stdin;
       extern FILE *stdout;
       extern FILE *stderr;
cpp 复制代码
FILE* fp...;

FILE是一个结构体,其中有一个字段是文件描述符。

文件描述符的本质就是数组下标。

vim中批量注释的方法

ctrl+v+j+I+//+Esc

u:取消

fgets:在读取完字符串后会给字符串添加'\0'

cpp 复制代码
int main()
{
    //r   w   r+(读写,不存在则报错)   w+(读写,不存在则创建)
    FILE* fp=fopen(FINE_NAME,"");
    
    return 0;
}

c语言中以w的形式打开文件,c会自动清空其内部的内容。

相关推荐
Fleshy数模4 小时前
MySQL 表创建全攻略:Navicat 图形化与 Xshell 命令行双模式实践
linux·mysql
神梦流5 小时前
GE 引擎的非标准数据流处理:稀疏张量与自定义算子在图优化中的语义保持
linux·运维·服务器
兜兜转转了多少年5 小时前
从脚本到系统:2026 年 AI 代理驱动的 Shell 自动化
运维·人工智能·自动化
.小墨迹5 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
Lsir10110_6 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
Sheffield6 小时前
command和shell模块到底区别在哪?
linux·云计算·ansible
历程里程碑6 小时前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
郝学胜-神的一滴6 小时前
深入浅出:使用Linux系统函数构建高性能TCP服务器
linux·服务器·开发语言·网络·c++·tcp/ip·程序人生
承渊政道6 小时前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee
技术路上的探险家6 小时前
Ubuntu下Docker与NVIDIA Container Toolkit完整安装教程(含国内源适配)
linux·ubuntu·docker