Linux C 语言文件 IO 与构建工具实战指南

软件包管理器

Linux下使用vscode进行代码编写

makefile

cpp 复制代码
sudo apt install -y build-essential

使用这个进行安装。其使用格式如下

cpp 复制代码
CC:=gcc
fopen_test: fopen_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@

文件IO

打开/关闭文件

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

int main()
{
    FILE* ioFile = fopen("a.txt","w+");
    if(ioFile == NULL)
    {
        printf("打开错误\n");
    }
    else
    {
        printf("打开成功\n");

    }
    int ret = fclose(ioFile);
    if(ret == EOF)
    {
        printf("关闭文件失败\n");
    }
    else if(ret == 0)
    {
        printf("关闭文件成功");
    }
    return 0;
}

向文件写入数据

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

int main()
{
    FILE* ioFile = fopen("a.txt","a+");
    if(ioFile == NULL)
    {
        printf("打开错误\n");
    }
    else
    {
        printf("打开成功\n");

    }
    fputc('a',ioFile);
    fputs("i am real\n",ioFile);
    char arr[] = "云山";
    fprintf(ioFile,"大风手印:%s\n",arr);
    int ret = fclose(ioFile);
    if(ret == EOF)
    {
        printf("关闭文件失败\n");
    }
    else if(ret == 0)
    {
        printf("关闭文件成功");
    }
    return 0;
}

从文件读取数据

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

int main()
{
    FILE *ioFile = fopen("a.txt", "r");
    if (ioFile == NULL)
    {
        printf("打开错误\n");
    }
    else
    {
        printf("打开成功\n");
    }
    // char get = fgetc(ioFile);
    //  while(get != EOF)
    //  {
    //      printf("%c",get);
    //      get = fgetc(ioFile);
    //  }
    //  printf("\n");
    // char arr[128];
    // while(fgets(arr, sizeof(arr), ioFile))
    // {
    //     printf("%s",arr);
    // }
    // printf("\n");

    char arr[128];
    while(fscanf(ioFile, "%s", arr) == 1)
    {
    printf("%s\n", arr);
    }
    printf("\n");
    int ret = fclose(ioFile);
    if (ret == EOF)
    {
        printf("关闭文件失败\n");
    }
    else if (ret == 0)
    {
        printf("关闭文件成功");
    }
    return 0;
}

标准输入/输出/错误

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>

int main()
{
    char *ch = (char*)malloc(sizeof(char)*100);
    fgets(ch,100,stdin);
    fputs(ch,stdout);
    return 0;
}

系统调用

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

int main()
{
    int ret = open("a.txt",O_RDONLY|O_CREAT|O_WRONLY,0664);
    if(ret == -1)
    {
        printf("打开文件失败\n");
    }
    char arr[32];
    read(ret,arr,sizeof(arr));
    printf("%s",arr);
    return 0;
}
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int fd = open("a.txt",O_RDONLY);
    if(fd == -1)
    {
        printf("打开文件失败\n");
        exit(EXIT_FAILURE);
    }
    char buffer[256];
    ssize_t bytes = 0;
    while((bytes = read(fd,buffer,sizeof(buffer))) > 0)
    {
        write(STDOUT_FILENO, buffer, bytes);
    }
    printf("\n");
    if(bytes == -1)
    {
        printf("打印失败\n");
        close(fd);
        exit(EXIT_FAILURE);
    }
    return 0;
}

文件描述符

当打开一个文件,会得到一个句柄,里面的信息就与文件物理进行相互关联,来保证我们对文件进行操作。

0是标准输入(stdin)的文件描述符,1是标准输出(stdout)的文件描述符,2是标准错误(stderr)的文件描述符。

cpp 复制代码
struct file {
    ...... 
atomic_long_t f_count;       // 引用计数,管理文件对象的生命周期
    struct mutex f_pos_lock;     // 保护文件位置的互斥锁
    loff_t f_pos;                // 当前文件位置(读写位置)
    ...... 
struct path f_path;          // 记录文件路径
    struct inode *f_inode;              // 指向与文件相关联的inode对象的指针,该对象用于维护文件元数据,如文件类型、访问权限等
    const struct file_operations *f_op; // 指向文件操作函数表的指针,定义了文件支持的操作,如读、写、锁定等
    ...... 
void *private_data;                  // 存储特定驱动或模块的私有数据
    ......
} __randomize_layout
    __attribute__((aligned(4)));
相关推荐
bosins2 小时前
彻底解决 WSL 2.7+ 空闲自动关闭/内存回收导致 Docker 中断的问题
linux·docker·wsl·dashboard
LongRunning3 小时前
【Linux】H3网络(二)
linux
国际云,接待4 小时前
华为云 EVS 性能诊断:用 CES、ECS QoS 与 fio 定位 IOPS 和吞吐瓶颈
服务器
xx~t4 小时前
嵌入式学习——ARM1
linux·arm开发·嵌入式硬件·arm
xx~t4 小时前
嵌入式——ARM1(详细篇)
linux·arm开发·嵌入式硬件·arm
智恒百亿7 小时前
RTX 5090 八卡服务器 vs RTX PRO 6000 整机:AI 推理、微调与渲染选型部署指南
运维·服务器·rtx5090
ManageEngineITSM7 小时前
DevOps和ITIL是什么关系?是替代还是互补一文讲清
java·服务器·资产管理·变更管理
DYWorker0017 小时前
Linux驱动子系统:DMA-Buf —— Consumer和Provider(008)
linux·驱动开发
雯宝8 小时前
Linux 内核函数集
linux
码少女8 小时前
Linux--多路转接之select
java·服务器·数据库