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)));
相关推荐
还卿一钵无情泪15 小时前
Unsloth 微调 构建自己的大模型 没有GPU也能微调
linux·开发语言·人工智能·python·大模型·nlp·unsloth
高山有多高15 小时前
【Linux笔记】IO模型
linux
不会就选b16 小时前
Linux之TCP理论<1>
linux·运维·服务器
小π军16 小时前
操作系统面试题
java·linux·服务器
Lsetea17 小时前
curl用IP测试HTTPS报证书不匹配:--resolve与Host头别混用
linux·https·ssl证书·openssl·curl
Hao28518 小时前
Windows11 下把 WSL2 Ubuntu 26.04 装到 D 盘完整
linux
Android系统攻城狮18 小时前
Linux Gstreamer深度解析之gst_audio_encoder_get_frame_samples_min调用流程与实战(六十)
linux·运维·服务器·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
_upupup19 小时前
Linux中的自动化构建——make/Makefile
linux·运维·自动化
HEJOO919 小时前
Linux 设备驱动系列——使用全局工作队列
java·linux·算法
slimer20 小时前
07.进制转换上篇:位权展开与十进制互转
linux