Linux -文件I/O操作

news2024/11/17 15:38:35

文章目录

  • C语言文件I/O相关函数操作
    • fopen/fcolse
    • fwrite
    • fseek
    • fprintf/fscanf
    • fgets/fputs
  • 系统调用相关接口
    • open/close
    • write/read

C语言文件I/O相关函数操作

fopen/fcolse

fopen 函数用于打开一个文件,并根据指定的模式(如只读、只写、读写等)返回一个指向该文件的 FILE 类型的指针。如果文件打开失败,fopen 将返回 NULL。
函数原型:

FILE *fopen(const char *filename, const char *mode);

filename:要打开文件的名称(包括路径,如果需要的话)。
mode:指定文件打开的模式。常见的模式有 “r”(只读)、“w”(只写,文件存在则长度被截断为零,即该文件内容会消失;文件不存在则创建新文件)、“a”(追加,写入的数据会被追加到文件尾,如果文件不存在则创建新文件)、“r+”(读写,文件必须存在)、“w+”(读写,同上,但文件内容会被清空)、“a+”(读写,写入的数据会被追加到文件尾)等。

man fopen查看相关信息:
在这里插入图片描述
在这里插入图片描述

fclose 函数用于关闭一个先前用 fopen 或 fdopen 打开的文件。关闭文件是一个好习惯,可以释放文件相关的资源并确保所有的输出都被正确地写入文件。
函数原型如下:

int fclose(FILE *stream);

stream:指向 FILE 对象的指针,该 FILE 对象标识了要关闭的文件。

fclose 函数在成功时返回 0,在失败时返回 EOF。然而,在大多数实现中,fclose 仅在极少数情况下会失败(如写入文件时磁盘空间不足),并且通常它总是能成功关闭文件。

写文件:

#include <stdio.h>
#include <string.h>
int main()
{
 FILE *fp = fopen("myfile", "w");
 if(!fp){
 printf("fopen error!\n");
 }
 const char *msg = "hello bit!\n";
 int count = 5;
 while(count--){
 fwrite(msg, strlen(msg), 1, fp);
 }
 fclose(fp);
 return 0;
}

在这里插入图片描述

fwrite

fwrite 函数用于向文件写入数据块。它从一个数组中获取数据,并将数据写入到文件中。与 fprintf 不同的是,fwrite 不对数据进行格式化,而是直接按照数据块的原始形式写入。
函数原型如下:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

ptr:指向要写入的数据块的指针。
size:每个数据块的大小(以字节为单位)。
nmemb:数据块的个数。
stream:指向 FILE 对象的指针,该 FILE 对象标识了要写入数据的文件。

fwrite 返回成功写入的数据块的数量,通常这等于 nmemb 的值,除非发生了错误或达到了文件末尾。

我们用fwrite向myfile中写入:

#include<stdio.h>    
#include<string.h>
 
int main()
{
    FILE* fp = fopen("myfile","w");
    if(fp==NULL)
    {
        perror("fopen");
    }
   //进行文件操作
   const char *s1 = "hello Linux\n"; 
   fwrite(s1, strlen(s1), 1, fp);
 
  
    fclose(fp);    
    return 0;
}

在这里插入图片描述

fseek

fseek 函数用于设置文件内部的位置指针,即文件读/写的下一个位置。通过调用 fseek,程序可以在文件中前后移动,进行非顺序访问。

函数原型如下:

int fseek(FILE *stream, long offset, int whence);

stream:指向 FILE 对象的指针,该 FILE 对象标识了要移动位置的文件。
offset:相对于 whence 指定的位置的偏移量,以字节为单位。
whence:指定从哪个位置开始计算偏移量。它可以是 SEEK_SET(文件开头)、SEEK_CUR(当前位置)、或 SEEK_END(文件末尾)。

fseek 成功时返回 0,失败时返回非零值。

用fseek修改myfile中特定位置:

#include <stdio.h>  
  
int main() {  
    FILE *fp = fopen("myfile", "r+"); // 以读写模式打开文件  
    if (fp == NULL) {  
        perror("Error opening file");  
        return -1;  
    }  
  
    // 假设我们要修改文件中的某些内容  
    fseek(fp, 5, SEEK_SET); // 将文件位置指针移动到文件开头后的第5个字节  
    fputc('X', fp); // 在当前位置写入字符'X'  
  
    fclose(fp);  
    return 0;  
}

在这里插入图片描述

fprintf/fscanf

fprintf函数用于向文件或标准输出流(如stdout)写入格式化的数据。它的工作方式类似于printf,但fprintf允许你指定一个输出流(FILE* 类型的指针),而不仅仅是标准输出。

函数原型:

int fprintf(FILE *stream, const char *format, ...);

stream:指向FILE对象的指针,指定了输出目标。
format:格式化字符串,指定了后续参数如何被格式化和插入到输出流中。
…:可变数量的参数,根据format字符串中的格式说明符进行格式化。

返回值: 成功时返回写入的字符数(不包括末尾的空字符),失败时返回负值。

fprintf示例:

#include <stdio.h>  
  
int main() {  
    FILE *fp = fopen("output.txt", "w"); // 打开文件用于写入  
    if (fp == NULL) {  
        perror("Error opening file");  
        return -1;  
    }  
  
    // 使用 fprintf 写入格式化的数据  
    fprintf(fp, "Name: %s\nAge: %d\n", "Alice", 30);  
  
    fclose(fp); // 关闭文件  
    return 0;  
}

在这里插入图片描述

fscanf函数用于从文件或标准输入流(如stdin)读取格式化的输入。它类似于scanf,但允许你指定一个输入流(FILE* 类型的指针)。

函数原型:

int fscanf(FILE *stream, const char *format, ...);

stream:指向FILE对象的指针,指定了输入源。
format:格式化字符串,指定了如何解析输入流中的数据。
…:可变数量的参数,用于存储解析出的数据。

返回值: 成功匹配并赋值的输入项的数量,如果到达文件末尾或发生读取错误,则可能返回EOF。

fgets/fputs

fgets函数用于从指定的文件流中读取一行数据,直到遇到换行符(‘\n’)、文件结束符(EOF)或已读取了n-1个字符为止(其中n是fgets函数的第三个参数指定的最大字符数)。读取的字符串会在末尾自动添加一个空字符(‘\0’)以标记字符串的结束。

函数原型:

char *fgets(char *str, int n, FILE *stream);

str:指向用于存储读取数据的字符数组的指针。
n:指定了最多读取的字符数(包括末尾的空字符)。
stream:指向FILE对象的指针,指定了输入源。

返回值: 成功时返回指向str的指针,失败时或到达文件末尾时返回NULL。
示例:

#include <stdio.h>  
  
int main() {  
    FILE *fp = fopen("myfile", "r"); // 打开文件用于读取  
    if (fp == NULL) {  
        perror("Error opening file");  
        return -1;  
    }  
  
    char line[100];  
  
    // 使用 fgets 逐行读取文件  
    while (fgets(line, sizeof(line), fp) != NULL) {  
        printf("%s", line); // 打印读取的行  
    }  
  
    fclose(fp); // 关闭文件  
    return 0;  
}

这个示例将逐行读取lines.txt文件的内容,并打印到标准输出上。
在这里插入图片描述

fputs函数用于将一个字符串写入到指定的文件流中,但不包括末尾的空字符(‘\0’)。与fputs相对的是fputs_s(在某些安全敏感的环境中可用),它要求明确指定目标缓冲区的大小,以防止缓冲区溢出。

函数原型:

int fputs(const char *str, FILE *stream);

str:指向要写入文件的字符串的指针。
stream:指向FILE对象的指针,指定了输出目标。

返回值: 成功时返回非负值,失败时返回EOF。

示例:

#include <stdio.h>  
  
int main() {  
    FILE *fp = fopen("copy.txt", "w"); // 打开文件用于写入  
    if (fp == NULL) {  
        perror("Error opening file");  
        return -1;  
    }  
  
    // 使用 fputs 写入字符串到文件  
    fputs("Hello, World!\n", fp);  
    fputs("This is another line.\n", fp);  
  
    fclose(fp); // 关闭文件  
    return 0;  
}

系统调用相关接口

系统调用是操作系统提供给用户程序与操作系统内核进行交互的接口。在C语言中,这些系统调用通常通过库函数封装后提供给用户使用,这些库函数定义在如<unistd.h>(POSIX标准)、<fcntl.h>等头文件中。下面将介绍open、close、write、read这四个系统调用

open/close

open系统调用用于打开或创建一个文件。它返回一个文件描述符(一个非负整数),用于后续的read、write等系统调用。如果打开失败,则返回-1。

函数原型(POSIX标准):

#include <fcntl.h>  
#include <sys/types.h>  
#include <sys/stat.h>  
#include <unistd.h>  
  
int open(const char *pathname, int flags);  
int open(const char *pathname, int flags, mode_t mode);

pathname:要打开或创建的文件的名称。
flags:用于指定文件如何被打开或创建,例如O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)、O_CREAT(如果文件不存在则创建)、O_TRUNC(如果文件已存在且为只写或读写模式,则长度截断为0)等。
mode(可选):如果文件被创建,这个参数指定了文件的权限。

man open查看详细信息
在这里插入图片描述

#include <fcntl.h>  
#include <unistd.h>  
#include <stdio.h>  
  
int main() {  
    int fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);  
    if (fd == -1) {  
        perror("open failed");  
        return -1;  
    }  
    // 后续可以使用fd进行write等操作  
    close(fd); // 不要忘记关闭文件  
    return 0;  
}

在这里插入图片描述
close系统调用用于关闭一个打开的文件描述符。关闭文件描述符会释放文件或设备相关的资源,并确保所有的输出都被正确地写入。

函数原型:

#include <unistd.h>  
  
int close(int fd);

fd:要关闭的文件描述符。

write/read

write系统调用用于将数据写入到打开的文件描述符中。

函数原型:

#include <unistd.h>  
  
ssize_t write(int fd, const void *buf, size_t count);

fd:要写入的文件描述符。
buf:指向要写入数据的缓冲区的指针。
count:要写入的字节数。

返回值:
成功:返回实际写入的字节数。
失败:返回-1,并设置errno来指示错误。

read系统调用用于从打开的文件描述符中读取数据。

函数原型:

#include <unistd.h>  
  
ssize_t read(int fd, void *buf, size_t count);

fd:要从中读取数据的文件描述符。
buf:指向存储读取数据的缓冲区的指针。
count:要读取的最大字节数。

返回值:
成功:返回实际读取的字节数。
失败:返回-1,并设置errno来指示错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2104193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SaaS行业渠道管理的深度探索:两种增长模式哪个更强?

在当今数字化时代&#xff0c;SaaS&#xff08;Software-as-a-Service&#xff09;行业正以前所未有的速度重塑企业运营模式。随着市场的日益成熟与竞争的加剧&#xff0c;渠道管理不再仅仅是产品销售的通道&#xff0c;而是成为了SaaS企业构建生态体系、实现业务飞跃的重要策略…

分类预测|基于粒子群优化轻量级梯度提升机算法数据预测Matlab程序PSO-LightGBM 多特征输入多类别输出

分类预测|基于粒子群优化轻量级梯度提升机算法数据预测Matlab程序PSO-LightGBM 多特征输入多类别输出 文章目录 一、基本原理二、实验结果三、核心代码四、代码获取五、总结 分类预测|基于粒子群优化轻量级梯度提升机算法数据预测Matlab程序PSO-LightGBM 多特征输入多类别输出 …

电脑录屏软件哪家强?这6款高效免费工具让你轻松捕捉电脑屏幕

在数字化浪潮的推动下&#xff0c;电脑录屏软件的选择变得琳琅满目&#xff0c;本文旨在帮助您挑选出最适合您需求的录屏工具。 电脑录屏软件在我们的日常工作、学习乃至娱乐活动中扮演着越来越重要的角色。无论是为了记录PPT的演示过程、捕捉QQ、微信、腾讯会议等设计软件的对…

C8T6超绝模块--按键检测点亮LED

C8T6超绝模块–按键检测点亮LED 大纲 按键原理初始化LED初始化按键编写main 具体案例 按键原理 (这里针对的是我的板子的原理图&#xff0c;具体的查看自己的板子)注意看&#xff0c;这里按键一端接到的是地&#xff0c;当我们没按下按键时&#xff0c;其默认是低电压&…

linux环境下升级nodejs版本

文章目录 简介清除缓存信息确保已安装Node.js和npm安装n模块使用n来升级Node.js查看可用的Node.js版本升级Node.js到最新版本注意事项版本兼容性考虑 简介 在Linux环境下&#xff0c;使用npm的n模块来升级Node.js版本是一种非常流行且便捷的方法。n是一个Node.js版本管理工具&…

【OpenCV】通过迭代器获取图像的像素

文章目录 1. 前置知识2. 通过迭代器获取图像的像素 1. 前置知识 &#x1f427; 什么叫做像素&#xff1f; 最小的 图像单元&#xff0c;每个像素可以看成图像中的一个点&#xff0c;它具有颜色、亮度等属性。 cv::Mat是OpenCV中用来处理图像数据的主要数据结构&#xff0c;他实…

tomato靶场通关攻略

1.御剑2014找到IP地址 2.dirb扫描目录 3.再次详细扫描目录 4.访问找到的目录文件 进入antibots中 5.搜寻一会再info.php里面发现有东西 6.这个地方貌似可以进行利用 7.查看源代码发现包含include文件上传漏洞 8.网址后面跟?image../../../../../../../etc/passwd 9.既然可以查…

ceph-iscsi 手动安装过程中的一些问题记录以及解决办法

ceph-iscsi 手动安装教程 安装教程&#xff0c;建议直接看官方文档&#xff0c;猛戳传送门。官方教程是英文版的&#xff08;不知道有没有中文版&#xff09;&#xff0c;都是一些基础英语&#xff0c;问题不大&#xff0c;实在不行找个翻译软件帮帮忙&#xff0c;哈哈哈。 多…

黄力医生揭秘血栓‘成长’之路,七类人群需高度警惕!

血栓&#xff0c;这个潜伏在血液中的“隐形杀手”&#xff0c;悄无声息地阻塞着生命的通道。它如同道路上的障碍&#xff0c;一旦形成&#xff0c;便可能随着血液流向身体各处&#xff0c;引发脑梗、心梗甚至肺栓塞等严重后果。然而&#xff0c;大多数血栓在形成初期并无明显症…

CodeMeter赋能工业应用程序市场,实现安全与灵活的应用管理

面临挑战 在快速发展的工业自动化领域&#xff0c;软件保护和许可成为各行业决策者日常面临的关键问题。无论是自制还是购买&#xff0c;都需应对复杂的集成任务和多样化的用户需求。对于软件开发者来说&#xff0c;将先进的保护和许可技术&#xff08;如CodeMeter&#xff09;…

ISO 26262中的失效率计算:SN 29500-11 Expected values for contactors

目录 引言 1 基准条件下的失效率 2 失效率转换 2.1 失效率预测模型 2.2 开关速率应力系数 2.3 电压应力系数 2.3.1 电压应力系数计算模型 2.3.2 电压应力系数计算 2.4 电流应力系数 2.4.1 电流应力系数计算模型 2.4.2 电流应力系数计算 2.5 温度应力系数 2.6 环境…

Web前端 lucky-canvas【大转盘 九宫格 老虎机】抽奖插件(适用JS/TS、Vue、React、微信小程序、Uniapp和Taro)

Web前端 lucky-canvas 抽奖插件&#xff08;JS/TS、Vue、React、微信小程序、Uniapp和Taro&#xff09; 基于 JS Canvas 实现的【大转盘 & 九宫格 & 老虎机】抽奖&#xff0c;致力于为 WEB 前端提供一个功能强大且专业可靠的营销组件&#xff0c;只需要通过简单配置即…

一篇常见第三方库之以及详细使用示例教程

作者&#xff1a;郭震 我们介绍了几个常用的 Python 第三方库,包括 NumPy、Pandas、Matplotlib 和 Requests.本篇将通过一些简单的示例来演示如何有效地使用这些库,以帮助小白理解它们的基本用法.通过这些案例,你可以直观感受到这些库在日常编程中的价值. NumPy NumPy 是一个强…

计算机毕业设计选题推荐-动漫网站-动漫管理系统-Java/Python

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

虚拟化pve查看存储空间使用情况

通过命令行查看 pvesm 是 Proxmox VE 的存储管理工具&#xff0c;可以用来查看存储空间的使用情况。 pvesm status这个命令会列出所有配置的存储设备及其使用情况&#xff0c;包括总空间、已用空间和可用空间。 在 Proxmox VE (PVE) 中&#xff0c;local 和 local-lvm 是两种…

软考超详细准备之软件设计师的计算机系统题型一(上午题)

目录 考试技巧: 上午题: 下午题: 第一道数据流图 第二道数据库 第三道 UML 第四道算法题 第五道程序题 软考刷题之计算机系统 cpu 相关习题 运算器 相关习题 控制器 相关习题 计算机的基本单位: 加法: ​编辑 加减法 相关习题 数据表示 各种码制的范围 相…

AI时代的信仰是什么

信仰是人们内心深处的信念&#xff0c;是推动人类前进的驱动力。AI从几十年前的缓慢探索&#xff0c;到如今的飞速发展&#xff0c;是什么信仰在驱动这一切呢&#xff1f; 摩尔定律 聊起信仰&#xff0c;我就会想起信息时代的摩尔定律。摩尔定律是由英特尔联合创始人戈登摩尔…

微信支付开通商家转账到零钱方法【必过技巧】

自从微信支付关闭&#xff0c;企业付款到零钱后&#xff0c;改成了商家转账到零钱&#xff0c;申请开通这一功能审核很严格。想把微信商户里的钱转到个人微信上就很麻烦了。 首先看下开通条件 开通条件 暂时不支持小微商户、个体工商户。 保持正常健康交易。 转账规则 日限…

【LabVIEW学习篇 - 17】:人机交互界面设计01

文章目录 VI属性设置编辑器选项窗口外观窗口大小窗口运行时的位置执行 对话框对话框使用范例自定义对话框 VI属性设置 在LabVIEW中&#xff0c;设计人机交互界面还是很方便的&#xff0c;主要是因为LabVIEW针对行业特点提供了丰富的控件&#xff0c;使其具有极其强大的图形数据…

智能提醒助理系列-基础设施准备

本系列文章记录“智能提醒助理”wx公众号 建设历程。 一、需求背景 建设一个智能提醒小程序&#xff0c;通过公众号、短信、电话提醒用户。 提供以下能力&#xff1a; 1、节日提醒&#xff1a;生日、节日、纪念日问候祝福。 2、健康守护&#xff1a;喝水、久坐、健身、用药提…