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)));
相关推荐
无人生还别怕17 分钟前
如何搭建k8s服务(containerd部署)
linux·云原生·容器·kubernetes·openanolisos
智购科技自动售货机厂家25 分钟前
让AI经营自动售货机:从Project Vend看工具权限与业务规则~YH
大数据·服务器·单片机·嵌入式硬件·深度学习
jnrjian27 分钟前
delete file shell 让 AI 写脚本
服务器·开发语言
数字新视界31 分钟前
空调控制器AIRC800的智能化管理与应用实践
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
知已难寻38 分钟前
01 · OpenStack的认证管理 Keystone
运维·服务器·云原生·云计算·openstack
企鹅侠客1 小时前
Linux CPU 负载平均值(Load Average)详解:从原理到实践
linux·运维·服务器·服务器负载
易点云徐源1 小时前
HP 暗影精灵 PRO 16 安装双系统后,开机直接进入 Windows,按 F9 才能进入 Ubuntu:GRUB 菜单不显示的处理方法
linux·运维·ubuntu
吃一碗粉只付一碗钱2 小时前
10-令牌里的用户主键不要明文
服务器·数据库·sql·sqlserver·c#
第404号工位2 小时前
离职退电脑前别只点“清空回收站”!手把手教你彻底抹除凭证与数字痕迹
linux·python·架构
Linux运维技术栈2 小时前
WAF部署在防火墙后面,获取不到真实IP怎么办?
服务器·网络·tcp/ip·安全·防火墙·waf