首页 > 系统相关 >Linux系统编程—文件操作IO

Linux系统编程—文件操作IO

时间:2024-08-06 22:23:21浏览次数:12  
标签:文件 return IO 编程 fd file Linux perror include

此文章为本人学习笔记,若有错误求指正,自学推荐书籍《Linux/UNIX系统编程手册》,需要该书籍pdf文档可无偿分享。

文件概述

在UNIX/Linux系统中,一切皆为文件。这不仅包括普通文件和文件夹,还包括设备、进程、网络连接等。所有文件在系统中都是通过文件描述符来标识和操作的。

文件分类

  1. 文本文件:可以直接阅读和编辑的文件,如源代码文件(.c、.cpp)、文本文件(.txt)、HTML文件(.html)等。这些文件包含字符数据,并且通常使用换行符和文件结束标识符来组织内容。
  2. 二进制文件:包含非文本数据的文件,如可执行文件、目标文件、图片、音频、视频等。这些文件以二进制形式存储数据,更加紧凑,但不易于人类阅读。

示例比较

数据:65536

  • 字符串方式:"65536\0"(文本文件,占用6 bytes)
  • 整型方式:65536(整数,二进制文件,占用4 bytes)

文件描述符

文件描述符是一个非负整数,用于标识已打开的文件。在每个进程的上下文中,文件描述符是唯一的。文件描述符表维护着所有打开文件的状态和相关信息。

查看文件类型

使用file命令可以查看文件的类型。例如:

file example.txt

低级文件操作

低级文件操作直接使用系统调用,提供对文件的基本操作功能。这些操作依赖文件描述符。

主要函数

  • open:打开文件
  • close:关闭文件
  • read:读取文件内容
  • write:写入文件内容
示例代码
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int fd = open("example.txt", O_RDONLY);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    char buffer[100];
    ssize_t bytesRead = read(fd, buffer, sizeof(buffer));
    if (bytesRead == -1) {
        perror("read");
        close(fd);
        return 1;
    }

    // 打印读取的数据
    write(STDOUT_FILENO, buffer, bytesRead);

    close(fd);
    return 0;
}

文件模式

open函数的常用文件模式包括

  • O_RDONLY:只读模式
  • O_WRONLY:只写模式
  • O_RDWR:读写模式
  • O_CREAT:如果文件不存在则创建文件
  • O_TRUNC:如果文件存在则将文件长度截断为0
  • O_APPEND:每次写入时都会追加到文件末尾

高级文件操作

高级文件操作使用标准I/O库(<stdio.h>),提供了更高层次的抽象,使文件操作更加方便和直观。

主要函数

  • fopen:打开文件
  • fclose:关闭文件
  • fread:从文件读取数据
  • fwrite:向文件写入数据
  • fseek:移动文件指针
  • ftell:获取文件指针当前位置
  • fflush:刷新文件缓冲区
示例代码
#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("fopen");
        return 1;
    }

    char buffer[100];
    size_t bytesRead = fread(buffer, 1, sizeof(buffer), file);
    if (bytesRead < sizeof(buffer) && ferror(file)) {
        perror("fread");
        fclose(file);
        return 1;
    }

    // 打印读取的数据
    fwrite(buffer, 1, bytesRead, stdout);

    fclose(file);
    return 0;
}

文件访问模式

fopen函数的常用文件访问模式包括:

  • "r":只读模式
  • "w":写模式(如果文件存在则截断文件)
  • "a":追加模式(数据写入文件末尾)
  • "r+":读写模式(文件必须存在)
  • "w+":读写模式(如果文件存在则截断文件)
  • "a+":读写模式(数据追加到文件末尾)

文件指针操作

在文件操作中,文件指针用于标识当前读取或写入的位置。以下是一些常用的文件指针操作函数:

lseek函数

用于在文件中移动文件指针位置。

#include <fcntl.h>
#include <unistd.h>

int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
    perror("open");
    return 1;
}

// 移动文件指针到文件末尾
off_t fileSize = lseek(fd, 0, SEEK_END);
if (fileSize == -1) {
    perror("lseek");
    close(fd);
    return 1;
}

printf("文件大小: %ld bytes\n", fileSize);

close(fd);

fseek和ftell函数

用于在高级文件操作中移动和获取文件指针位置。

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("fopen");
        return 1;
    }

    // 移动文件指针到文件末尾
    fseek(file, 0, SEEK_END);
    long fileSize = ftell(file);
    if (fileSize == -1) {
        perror("ftell");
        fclose(file);
        return 1;
    }

    printf("文件大小: %ld bytes\n", fileSize);

    fclose(file);
    return 0;
}

常见错误处理

文件操作中常见的错误包括文件无法打开、读写错误等。可以使用perror函数或strerror函数来输出错误信息。

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("fopen");
        fprintf(stderr, "Error opening file: %s\n", strerror(errno));
        return 1;
    }

    // 进行文件操作

    fclose(file);
    return 0;
}

总结

文件操作是C语言编程中的基础知识,通过掌握低级和高级文件操作函数,可以灵活地处理各种类型的文件。对于复杂的文件操作,可以结合使用文件指针操作函数,如lseekfseekftell。同时,注意处理文件操作中的错误,确保程序的健壮性。

标签:文件,return,IO,编程,fd,file,Linux,perror,include
From: https://blog.csdn.net/m0_64319028/article/details/140959242

相关文章

  • 分布式存储MinIO Console
    MinIO是什么?一种对象存储解决方案,Minio提供与亚马逊云科技S3兼容的API,并支持所有核心S3功能,所以也可以看做是S3的开源版本;它允许用户通过简单的API接口进行数据的存储和检索,同时提供高度可扩展性和强大的数据保护机制。MinIo主要是在微服务系统中使用,非常适合于存储......
  • 【linux】关于qemu-img创建虚拟机前端磁盘报错
    问题描述:使用qemu-imgcreate-fqcow2-bcirros.qcow2vmhost.img20G创建虚拟机磁盘出现以下报错,报错内容:qemu-img:vmhost.img:BackingfilespecifiedwithoutbackingformatDetectedformatofqcow2.[root@ecsimages]#qemu-imgcreate-fqcow2-bcirros.qcow2vmho......
  • WSL2Linux 子系统(九)
    WSL挂载硬盘/U盘/SD卡上一篇文章《WSL2Linux子系统(八)》讲解WSL与Windows之间端口转发规则和正向端口代理。《WSL2Linux子系统(六)》中仅仅简单讲解WSL(WindowsSubsystemforLinux)挂载硬盘,本篇继续详细讲解几种常见硬盘挂载使用。挂载外部硬盘到WSL不仅可以扩......
  • WPF DataGrid Checkbox column to implement select and unselect items explicitly v
    <DataGridTemplateColumnHeader="Select"><DataGridTemplateColumn.CellTemplate><DataTemplate><CheckBoxIsThreeState="False"><behavior:Interaction.Triggers>......
  • Linux文件管理
    VIM编辑vi和vim命令是linux中强大的文本编辑器,由于Linux系统一切皆文件,而配置一个服务就是在修改其配置文件的参数。vim编辑器是运维工程师必须掌握的一个工具,没有它很多工作都无法完成。vim其实是vi的升级版那么vi与vim有什么区别?vi不显示高亮颜色语法vim......
  • Linux命令速查表:压缩备份命令
    ar功能说明:建立或修改备存文件,或是从备存文件中抽取文件。语法:ar[-dmpqrtx][cfosSuvV][a<成员文件>][b<成员文件>][i<成员文件>][备存文件][成员文件]补充说明:ar可让您集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限。参数:指令参......
  • 【rz & rb & rz】Centos/Linux rz、rb、rz命令详细介绍
    【rz&rb&rz】Centos/Linuxrz、rb、rz命令详细介绍简介基础语法选项介绍基本用法安全事项环境变量注意事项简介        系统版本:Centos7.6        rz、rb、rz命令属于lrzsz程序的内容,是使用纠错协议通过拨号串行端口从在PC-DOS、CP/M、Unix和......
  • 【论文笔记】Cross-Domain WiFi Sensing with Channel State Information: A Survey
    Cross-DomainWiFiSensingwithChannelStateInformation:ASurveyIntroduction检测领域:检测领域里,大部分用的阈值检测或者简单的学习算法,例如SVM。fallsRT-Fall:Areal-timeandcontactlessfalldetectionsystemwithcommodityWiFidevicesWiFall:Device-fr......
  • SQLServer 事务复制订阅节点非活跃状态(inactive)错误的处理:Error in replication::subs
    事务复制中订阅节点非活动( inactive)错误在SQLServer的事务复制模型中,会出现“订阅过期”的错误,相关订阅分发代理Job的典型错误如下:"AgentSQLNYC01-Onvoices-PubInvoicesInvoices-SQLNYC01-1353is retryingafteranerror. 211retriesattempted.Seeagentjobhistoryin......
  • 编程深水区之并发②:JS的单线程事件循环机制
    如果某天有人问你,Node.js是单线程还是多线程,你如何回答?一、单线程并发原理我们以处理Web请求为例,来看看Node在处理并发请求时,究竟发生了什么。Node启动Web服务器后,创建主线程(只有一个)。当有一个阻塞请求过来时,主线程不会发生阻塞,而是继续处理其它代码或请求。如果阻塞......