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)));
相关推荐
yyuuuzz42 分钟前
企业出海云服务器部署踩坑记录:从频繁超时到稳定运行的复盘
运维·服务器·网络·人工智能·aws
Linux运维技术栈1 小时前
深度拆解 Linux logrotate 重复切割问题:根因、排查与生产级根治方案
linux·logrotate
ouynagda1 小时前
Linux多线程:互斥锁与信号量学习笔记
linux·笔记·学习
重生之我是Java开发战士2 小时前
【Java EE】认识Linux与项目部署
java·linux·java-ee
EasyGBS2 小时前
连锁书店如何用国标GB28181公网平台EasyGBS把“远程巡店”做成日常基本功?
服务器·网络·音视频
Tisfy2 小时前
LeetCode 3720.大于目标字符串的最小字典序排列:状态机 —— :从左往右枚举,失败则退回(最多退回一次)
linux·数据库·leetcode·字符串·状态机·构造
SKH.2 小时前
Linux软件编程(5)线程
java·linux·jvm
mounter6252 小时前
重构 Kexec Handover:Linux 内核如何将 KHO 打造为无状态、可重入的跨重启交接基石
linux·内存管理·linux kernel·kernel·liveupdate
Java小白笔记3 小时前
Codex CLI 使用与斜杠指令实战教程
服务器·数据库·oracle