Linux编程 IO(标准io,文件io,目录io)

标准IO 

 C语言标准IO概述

标准IO(Standard Input/Output)是C语言中用于处理文件和数据流的一组函数库,定义在<stdio.h>头文件中。与低级IO(如read/write)相比,标准IO提供了缓冲机制,提高了数据读写的效率。标准IO的核心是FILE结构体指针,通过它操作文件流。


fopen/fclose

功能

  • fopen:打开文件并返回文件指针。
  • fclose:关闭文件并释放资源。

函数原型

FILE *fopen(const char *filename, const char *mode);
int fclose(FILE *stream);

参数说明

  • filename:文件路径。
  • mode:打开模式(如"r"只读,"w"写入,"a"追加等)。
  • stream:已打开的文件指针。

示例

FILE *fp = fopen("test.txt", "w");
if (fp == NULL) {perror("Error opening file");return 1;
}
fclose(fp);


fgetc/fputc

功能

  • fgetc:从文件流中读取一个字符。
  • fputc:向文件流写入一个字符。

函数原型

int fgetc(FILE *stream);
int fputc(int c, FILE *stream);

示例

FILE *fp = fopen("test.txt", "r");
int ch = fgetc(fp); // 读取一个字符
fputc('A', fp);     // 写入字符'A'


fgets/fputs

功能

  • fgets:从文件流读取一行字符串。
  • fputs:向文件流写入字符串(不自动添加换行符)。

函数原型

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

参数说明

  • str:存储读取数据的缓冲区。
  • n:最多读取的字符数(包括\0)。

示例

char buffer[100];
fgets(buffer, 100, stdin); // 从标准输入读取
fputs("Hello", stdout);    // 输出到标准输出


fscanf/fprintf

功能

  • fscanf:格式化输入(类似scanf,但针对文件流)。
  • fprintf:格式化输出(类似printf,但针对文件流)。

函数原型

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

示例

int num;
fscanf(fp, "%d", &num);       // 从文件读取整数
fprintf(fp, "Number: %d", 42); // 写入格式化字符串


fread/fwrite

功能

  • fread:从文件流读取二进制数据块。
  • fwrite:向文件流写入二进制数据块。

函数原型

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

参数说明

  • ptr:数据缓冲区指针。
  • size:每个数据项的字节数。
  • nmemb:要读写的数据项数量。

示例

int arr[5] = {1, 2, 3, 4, 5};
fwrite(arr, sizeof(int), 5, fp); // 写入数组
fread(arr, sizeof(int), 5, fp);  // 读取数组


fseek/rewind/ftell

功能

  • fseek:设置文件流的位置指针。
  • rewind:重置文件指针到开头。
  • ftell:返回当前文件指针位置(字节偏移量)。

函数原型

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

参数说明

  • offset:偏移量。
  • whence:基准位置(SEEK_SET开头,SEEK_CUR当前位置,SEEK_END末尾)。

示例

fseek(fp, 10, SEEK_SET); // 移动到第10字节
rewind(fp);              // 回到文件开头
long pos = ftell(fp);    // 获取当前位置

利用fread和fwrite实现图片的拷贝

#include "../head.h"int main(void)
{FILE *fsrc = NULL;FILE *fdst = NULL;ssize_t nret = 0;char srcfile[256] = {0};char dstfile[256] = {0};char tmpbuff[4096] = {0};printf("请输入源图片:\n");fgets(srcfile, sizeof(srcfile), stdin);srcfile[strlen(srcfile)-1] = '\0';printf("请输入目的图片:\n");fgets(dstfile, sizeof(dstfile), stdin);dstfile[strlen(dstfile)-1] = '\0';fsrc = fopen(srcfile, "r");if (NULL == fsrc){perror("fail to fopen");return -1;}fdst = fopen(dstfile, "w");if (NULL == fdst){perror("fail to fopen");return -1;}while (1){nret = fread(tmpbuff, 1, sizeof(tmpbuff), fsrc);if (0 == nret){break;}fwrite(tmpbuff, 1, nret, fdst);}fclose(fsrc);fclose(fdst);return 0;
}

统计一个文件中出现最多的字符是哪个,出现了多少次

链表法
#include "../head.h"
#include "cirlist.h"int find_max_char(char *filename, int *pmaxchar, int *pmaxcnt)
{FILE *fp = NULL;linknode *pcirlist = NULL;linknode *ptmpnode = NULL;char ch = 0;pcirlist = create_empty_linklist();fp = fopen(filename, "r");if (NULL == fp){perror("fail to fopen");return -1;}while (1){ch = fgetc(fp);if (EOF == ch){break;}/* 如果第一次出现则新增该节点 */ptmpnode = find_linklist(pcirlist, ch);if (NULL == ptmpnode){insert_tail_linklist(pcirlist, ch);}/* 从链表中找到节点,计数器自加 */ptmpnode = find_linklist(pcirlist, ch);ptmpnode->cnt++;}fclose(fp);ptmpnode = find_max_node(pcirlist);if (ptmpnode != NULL){*pmaxchar = ptmpnode->data;*pmaxcnt = ptmpnode->cnt;}destroy_linklist(&pcirlist);return 0;
}   int main(void)
{char filename[256] = {0};int maxcnt = 0;int maxchar = 0;int ret = 0;printf("请输入要检测的文件名:\n");m_fgets(filename);ret = find_max_char(filename, &maxchar, &maxcnt);if (ret != 0){printf("fild max char failed\n");return -1;}printf("出现最多的字符:%c, 次数:%d\n", maxchar, maxcnt);return 0;
}
数组法
#include "../head.h"int find_max_char(char *filename, int *pmaxchar, int *pmaxcnt)
{FILE *fp = NULL;int cnt[256] = {0};char ch = 0;int max = 0;int i = 0;fp = fopen(filename, "r");if (NULL == fp){perror("fail to fopen");return -1;}while (1){ch = fgetc(fp);if (EOF == ch){break;}cnt[ch]++;}fclose(fp);max = 0;for (i = 1; i < 256; i++){if (cnt[i] > cnt[max]){max = i;}}*pmaxchar = max;*pmaxcnt = cnt[max];return 0;
}   int main(void)
{char filename[256] = {0};int maxcnt = 0;int maxchar = 0;int ret = 0;printf("请输入要检测的文件名:\n");m_fgets(filename);ret = find_max_char(filename, &maxchar, &maxcnt);if (ret != 0){printf("fild max char failed\n");return -1;}printf("出现最多的字符:%c, 次数:%d\n", maxchar, maxcnt);return 0;
}

文件IO

1.概念

  • 标准IO是有缓存的IO,文件IO没有缓存,适合于通信、硬件设备操作
  • 标准IO是库函数,文件IO是系统调用

2.系统调用与库函数

  • 系统调用:是Linux内核中的代码,只能在Linux系统中使用
  • 库函数:是对系统调用的封装,可以在不同的操作系统中安装并使用,库函数最终还是要调用系统 调用完成对应功能

3.文件IO函数接口

1. 函数接口:

2. 文件打开:

注意:
  • 有三个特殊的文件描述符:标准输入(0)、标准输出(1)、标准错误(2)
  • 文件描述符特点: 非负整数
  • 取尚未被占用的最小的非负整数 文件描述符是有上限的,到达上限后再打开会报错误

3. 关闭文件描述符

4. 请写出标准IO对应的文件IO的打开方式

5. 文件IO读写

1. write

2. read

6. 文件描述符偏移量的定位

1. lseek

7. 文件IO与标准IO互相转换的函数

1. fileno 功能:根据文件流指针获得文件描述符

2. fdopen 功能:根据已经打开的文件描述符获得文件流指针

3. feof 功能:判断文件流指针是否到达末尾

4. ferror 功能:判断文件流指针是否出错

目录IO

1.操作方式:

  • 打开目录文件
  • 读取目录文件中的目录项
  • 关闭目录文件

2.函数接口:

1. opendir

2. closedir

3. readdir

4. getcwd

5. chdir

6. mkdir

注意:
  • r:读权限,决定用户是否能够查看目录下所有文件名
  • w:写权限,决定用户是否能够在目录下新建文件
  • x:执行权限,决定用户是否能够进入目录

7. rmdir

3.文件名和路径:

  • file.txt:文件名
  • ./file.txt:路径

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

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

相关文章

C# WPF本地Deepseek部署

模型下载地址 using LLama; using LLama.Common; using System; using System.IO; using System.Threading.Tasks; using System.Windows; using System.Windows.Input;namespace YF_Talk {public partial class MainWindow : Window{private LLamaWeights _model;private LLa…

【Abp.VNext】Abp.Vnext框架模块学习

1、Abp.Vnext-集成 Volo.Abp.Core2、Abp.vNext-Web模块 Volo.Abp.AspNetCore.MVC框架&#xff08;framework文件夹&#xff09; 七、Abp.vNext-应用模块-Identity身份认证 业务模块&#xff08;modules文件夹->identity&#xff09; 1、添加领域模型 Volo.Abp.Identity.Doma…

【完整源码+数据集+部署教程】火柴实例分割系统源码和数据集:改进yolo11-rmt

背景意义 研究背景与意义 在计算机视觉领域&#xff0c;实例分割技术作为一种重要的图像处理方法&#xff0c;近年来得到了广泛的关注和应用。实例分割不仅能够识别图像中的物体类别&#xff0c;还能精确地分割出每个物体的轮廓&#xff0c;提供更为细致的视觉信息。这一技术在…

飞算JavaAI云原生实践:基于Docker与K8s的自动化部署架构解析

一、飞算JavaAI详细介绍 1.1 飞算JavaAI飞算JavaAI是飞算云智推出的一款革命性Java开发辅助工具&#xff0c;它通过人工智能技术深度赋能传统软件开发流程&#xff0c;特别为大学生课程设计、毕业设计等实践教学环节提供了强有力的技术支持。在当前高校计算机相关专业教学中&am…

小程序打通美团核销:解锁到店综合业态私域密码,赋能6000+门店破局增长

数字化浪潮奔涌而来&#xff0c;棋牌室、台球厅、亲子乐园等线下综合业态面临经营转型的关键节点。小程序与美团核销功能的深度耦合&#xff0c;正成为撬动私域流量的核心杠杆&#xff0c;为超6000家门店打通了一条低成本、高转化的经营快车道。过往经营模式中&#xff0c;线上…

Linux Shell:Nano 编辑器备忘

打开文件 sudo nano /etc/apt/sources.list选中多行&#xff0c;然后删除 用方向键将光标定位到要删除的起始位置按下 Alt A 设置锚点用方向键选择要删除的区域 (以上 3 步是为了选中文本)用 Ctrl K(剪切) 或 Alt D(直接删除) 全选并删除 按下 Alt \ 将光标移动到文件开头…

常见的设计模式(2)单例模式

目录 一、版本一&#xff1a;禁用构造与拷贝 二、版本二&#xff1a;注册析构函数/嵌套垃圾回收 &#xff08;1&#xff09;使用atexit注册程序结束时的函数 &#xff08;2&#xff09;使用对象嵌套垃圾回收 三、版本三&#xff1a;线程安全 四、版本四&#xff1a;编译器…

JAiRouter 0.2.1 更新啦:内存优化 + 配置合并 + IP 限流增强,运维体验再升级

JAiRouter 0.2.1 更新啦&#xff1a;内存优化 配置合并 IP 限流增强&#xff0c;运维体验再升级 如果你已经在 0.2.0 生产环境中稳定运行&#xff0c;那么这篇更新会让你无痛升级&#xff0c;直接“更轻、更稳、更省心”。 &#x1f4ce; 官方仓库 & issue 直达 https://…

学习嵌入式第二十六天

文章目录IO(续上)1.标准IO1.标准IO的接口2.流的定位2.文件IO1.概念&#xff1a;2.系统调用和库函数3.文件IO函数接口习题IO(续上) 1.标准IO 1.标准IO的接口 fwrite 原型&#xff1a;size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream); 功能&#xff1…

GDB 程序启动参数设置深度指南

GDB 程序启动参数设置深度指南 1. 概述 在程序调试过程中&#xff0c;正确设置启动参数对于验证程序行为、重现特定场景至关重要。GDB提供多种灵活的方式设置启动参数&#xff0c;特别是当您需要调试命令行参数处理逻辑或配置敏感型应用时。 2. 参数设置的核心方法 2.1 启动GDB…

Autudl华为昇腾系列NPU简介和部署推理yolo11 yolov8 yolov5分割模型

0.配置Autudl 下面图片是我所租的昇腾卡和具体环境版本&#xff0c;太具体的就不说了&#xff0c;有需要的话我单独出一期Autudl租显卡的教程&#xff0c;主要是为了学习昇腾环境如何运行Yolo系列模型。 0.1华为昇腾芯片&#xff08;Ascend&#xff09;简介 1.Ascend 310&…

什么是JSP和Servlet以及二者的关系

JSP&#xff08;JavaServer Pages&#xff09; 是“HTML 里写 Java”的模板技术&#xff0c;最终会被容器转换成 Servlet。Servlet 是“Java 里写 HTML”的 Java 类&#xff0c;直接继承 javax.servlet.http.HttpServlet&#xff0c;用来接收/响应 HTTP 请求。Servlet 是什么 纯…

【WonderTrader源码详解 1】【环境搭建 2】【编译安装WonderTrader】

一、引言 本篇来讲述如何搭建 wondertrader 和 wtpy 二、wondertrader 2.1 源码下载 # /home/leo/sda_1.6TBgit clone https://gitee.com/wondertrader/wondertrader.gitgit clone https://gitee.com/wondertrader/wtpy.git2.2 源码编译 cd /home/leo/sda_1.6TB/wondertrader/s…

hutool 作为http 客户端工具调用的一点点总结

场景一&#xff1a;客户端timeout 的时间给的很短//100毫秒 private static final int HTTP_TIMEOUT_MS 1 * 100; response HttpUtil.createPost(patrolresultconfirmUrl).body(JSONObject.toJSONString(search)).header("Authorization", token).timeout(HTTP_TI…

基于MongoDB/HBase的知识共享平台的设计与实现

标题:基于MongoDB/HBase的知识共享平台的设计与实现内容:1.摘要 在当今信息爆炸的时代&#xff0c;知识的有效共享和管理变得愈发重要。本研究的目的是设计并实现一个基于MongoDB/HBase的知识共享平台&#xff0c;以满足大规模知识数据的存储、高效查询和快速共享需求。方法上&…

PHP数组操作:交集、并集和差集

1. 交集&#xff08;Intersection&#xff09;交集是指两个集合中都存在的元素。$array1 [1, 2, 3, 4]; $array2 [3, 4, 5, 6];$intersection array_intersect($array1, $array2); print_r($intersection); // 输出: Array ( [2] > 3 [3] > 4 )2. 并集&#xff08;Uni…

Qt 常用控件 - 7

Text Edit&#xff08;多行输入框&#xff09;QTextEdit 表示多行输入框&#xff0c;也是一个富文本 & markdown 编辑器&#xff0c;能在内容超出范围时自动提供滚动条。QTextEdit&#xff1a;不仅仅能表示纯文本&#xff0c;还可以表示 htnl 和 markdownQPlainTextEdit&am…

JDK、eclipse的安装,配置JDK、Tomcat并使用eclipse创建项目

目录一、JDK的安装1. 安装JDK2. 配置环境变量3. 检查jdk是否已安装二、eclipse的安装1. 解压安装2. 设置字体大小3. 设置拼写提示三、tomcat安装四、创建项目1. 第一次创建一个普通的java项目2. 第一次创建一个java web项目扩展&#xff1a;运行项目报Tomcat端口占用&#xff0…

Iptables 详细使用指南

目录 1. 工作原理​ 2. 核心架构&#xff08;四表五链&#xff09; 2.1 四张表&#xff08;优先级从高到低&#xff09; 2.2 五条内置链&#xff08;数据包流向&#xff09; 3. Iptables规则 3.1 规则的匹配条件与目标动作 常见匹配条件&#xff08;用于筛选数据包&…

Vue 服务端渲染(SSR)详解

Vue SSR是一种在服务端将 Vue 应用渲染成 HTML 字符串&#xff0c;然后直接发送到客户端的技术。相比传统的客户端渲染&#xff0c;Vue SSR 能带来更好的 SEO 性能和更快的首屏加载时间。下面我们从零到一&#xff0c;结合项目源码&#xff0c;详细讲解如何实现一个 Vue SSR 项…