当前位置: 首页 > news >正文

linux高级编程——文件IO

linux高级编程——文件IO

  • 标准IO:stdio.h

标准IO:stdio.h

IO也就是输入input和输出output;
I: 键盘是标准输入设备,默认输入就是指键盘 /dev/input;
O: 显示器是标准输出设备,默认输出就是指显示器;

stdio是属于C语言标准库,那么它存在哪呢?
stdio.h存放的路径是:/usr/include/stdio.h路径下;
按照常理来说标准输入的实现是放在stdio.c当中,但是在系统当中这个实现文件并不是以.c的形式提供的,而是将stdio.c的文件编译了一下(链接),产生libc.so文件但是该文件当中是没有main函数的,因为该函数的实现是要被调用的所以该文件当中不会有main函数。该文件的后缀名在编译之后变成了.so这个表示这是一个动态库文件。因为系统认为标准C库当中的printf()和scanf()之类的函数被调用的频次比较高,所以该动态库放在linux操作系统当中放着,当要使用到标准输入和输出的相关函数的时候需要向操作系统发生申请。不把它放在a.out当中,可以节省开销,减少代码的冗余。

了解了标准IO那么我们应该怎么样去操作文件呢?

要想了解文件的读写操作就先要去了解流的概念:

流: FILE*
数据从文件当中流入和流出所体现出来的字节流叫做流。

流的分类:
二进制流: 2001 \n
二进制数据的流
文本流:
ASCII码数据的流 \n \t
FILE 结构定义的对象 FILE * 称之为流对象,也叫文件流指针。

文件操作的步骤:
1、打开文件 FILE;
2、io操作,读写操作;
3、关闭文件;

文件读写的相关函数:

**FILE *fopen(const char pathname, const char mode);
fopen()函数打开名为路径名指向的字符串的文件,并将流与之关联

形参:pathname为文件名,mode为打开文件的方式是读还是写;文件打开的方式又可以分为:
w:如果文件已经存在且文件当中有内容则在该模式下再打开文件是会先清空文件,如果文件不存在则会先创建文件然后再打开,具有读写的权限;
w+:在该模式下打开文件后清空而且带创建功能;
r:该模式下表示再打开文件是只具有读的权限;
r+:在该模式下打开文件后不清空文件的内容,可以读取旧的内容也可以写进新的内容;
a和a+:均有写的权限但是如果文件中有内容会接着旧的内容继续写,如果文件不存在则会创建文件然后打开。

*int fgetc(FILE stream);

fgetc()从流中读取下一个字符,并将其作为无符号char强制转换为int,或在文件末尾返回EOF,或错误。
返回值:在文件末尾或出现错误时,将读取的字符作为无符号char强制转换为int或EOF。

应用举例:

#include <stdio.h>int main(int argc, const char *argv[])
{FILE* fp = fopen("1.txt", "r");	if (NULL == fp){printf("fopen error\n");}while(1){int ret = fgetc(fp);if (EOF == ret){break;}printf("%c\n", ret);}fclose(fp);return 0;
}

上述程序打开了1.txt文件并读取里面的内容然后打印。因为fgetc一次只能读取一个字符所以采用了循环读取的方式,fgetc()适合读取小文件在读取大文件时效率比较低。

*int fputc(int c, FILE stream);

fputc()函数是能将转换为无符号char的字符c写入流。
返回值:在出错时将写为无符号char的字符转换为int或EOF。

应用举例:

#include <stdio.h>int main(int argc, const char *argv[])
{FILE *fp = fopen("1.txt", "w");if (NULL == fp){printf("fopen error\n");return 1;}int ret = fputc('h', fp);if (-1 == ret){printf("fputs error\n");return 1;}fputc('e', fp);fputc('l', fp);fputc('l', fp);fputc('o', fp);fclose(fp);return 0;
}

上述程序是把hello 写入了打开的1.txt文件当中。

**char *fgets(char s, int size, FILE stream);

fgets()从流中最多读取一个小于大小的字符,并将其存储到s指向的缓冲区中在EOF或换行符后停止。如果读取换行符,则将其存储到缓冲区中。终止符’\0’,存储在缓冲区中最后一个字符之后。

形参当中的s为读取缓冲区该缓冲区是本地内存当中的一段空间在读取大文件时通常缓冲区的大小设置在1k到4k之间,读取的过程是将文件的内容先读取到缓冲区然后再将缓冲区的内容读取到指定文件当中。

返回值:读取成功时返回s,出错时返回NULL,或者在没有读取字符的情况下发生文件结束时返回NULL。

应用举例:

#include <stdio.h>int main(int argc, const char *argv[])
{FILE* fp = fopen("/etc/passwd", "r");if (NULL == fp || NULL == fp2){printf("fopen error\n");return 1;}char buf[1024] = { 0 };while(1){char * s = fgets(buf, 1024, fp);if (NULL == s){break;}printf("%s\n", s);}fclose(fp);return 0;
}

上述程序把/etc/passwd文件的内容读取后并打印,char buf[1024] = { 0 };这就是把文件中的内容读取到缓冲区这一个过程是通过fgets(buf, 1024, fp);实现的,然后接收并打印返回值。

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

参数:
const char *s表示要写入的内容;
FILE *stream表示要写入的目标流文件;

fputs()将字符串s写入流,而不将’\0’写入。
返回值:成功写入时返回非负数,错误时返回EOF。

应用举例:

#include <stdio.h>int main(int argc, const char *argv[])
{FILE* fp = fopen("1.txt", "w");if (NULL == fp){printf("fopen error\n");return 1;}char data[] = "hello world!";int ret = fputs(data, fp);if (EOF == ret){printf("fputs error\n");return 1;}fclose(fp);return 0;
}

上述程序通过fputs(data, fp);将data字符数组中的内容将hello world!字符串写进了1.txt文件当中。

通过fgets()和fputs()函数实现拷贝的功能:

#include <stdio.h>int main(int argc, const char *argv[])
{FILE* fp = fopen("/etc/passwd", "r");FILE* fp2 = fopen("2.txt", "w");if (NULL == fp || NULL == fp2){printf("fopen error\n");return 1;}char buf[1024] = { 0 };while(1){char * s = fgets(buf, 1024, fp);if (NULL == s){break;}int ret = fputs(s, fp2);if(EOF == ret){printf("fputs error\n");return 1;}}fclose(fp);fclose(fp2);return 0;
}

上述程序把/etc/passwd文件当中的内容读取到缓冲区然后将缓冲区的内容写入2.txt文件当中,从而实现了拷贝的效果但是在拷贝照片文件时会发生照片的大小被缩小的问题,原因是:fgets()在读取时遇到\n就停止了在照片的二进制文件当中会存在\n所以在读取时不能将文件中的内容完整地读取而导致读取内容所占的字节数缩小。

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

函数fread()从流指向的流中读取nmemb个数据项(nmenb是可以指定的),每个数据项的长度为字节,并将其存储在由ptr给出的位置。

返回值:返回读取或写入的项目数。此数字等于传输的字节数仅当大小为1时才使用。如果发生错误,或者到达文件末尾,则返回值是一个零。

参数:
void *ptr表示读取到的数据存储的地方;
size_t size:表示读取每个项目是所占的字节数;
size_t nmemb:读取个数;
FILE *stream:表示从哪里读数据;

应用举例:

#include <stdio.h>
#include <string.h>typedef struct
{char name[50];int age;char phone[15];
}PER;int main(int argc, const char *argv[])
{FILE* fp = fopen("1.txt", "r");if (NULL == fp){printf("fopen error\n");}PER per;bzero(&per, sizeof(PER));//在读取前将per变量清0;size_t ret = fread(&per, sizeof(PER), 1, fp);printf("name : %s age : %d phone : %s\n", per.name, per.age, per.phone);//如果能正常打印就说明读取成功;if (ret != 1){printf("fread error\n");}fclose(fp);return 0;
}

size_t fwrite(const void ptr, size_t size, size_t nmemb, FILEstream);

函数fwrite()将nmemb个数据项(每个大小为字节长)写入流指向的流中,并获取它们从ptr给出的位置。

返回值同fread;

简单的应用举例:

#include <stdio.h>
#include <string.h>typedef struct
{char name[50];int age;char phone[15];
}PER;int main(int argc, const char *argv[])
{FILE* fp = fopen("1.txt", "w");if (NULL == fp){printf("fopen error\n");return 1;}PER per;strcpy(per.name, "xuan");per.age = 18;strcpy(per.phone, "11223344556677");size_t ret = fwrite(&per, sizeof(PER), 1, fp);if (ret != 1){printf("fwrite error\n");return 1;}fclose(fp);return 0;
}

上述程序通过fwrite(&per, sizeof(PER), 1, fp);就能写入一个per大小的结构体变量per的内容到1.txt间当中。

今天先到这明天再更新!

相关文章:

linux高级编程——文件IO

linux高级编程——文件IO 标准IO&#xff1a;stdio.h 标准IO&#xff1a;stdio.h IO也就是输入input和输出output&#xff1b; I&#xff1a; 键盘是标准输入设备&#xff0c;默认输入就是指键盘 /dev/input&#xff1b; O&#xff1a; 显示器是标准输出设备&#xff0c;默认输…...

windows C++-在 C++/WinRT 中使用委托处理事件(下)

撤销已注册的委托 当你注册委托时&#xff0c;通常会向你返回一个令牌。 随后&#xff0c;可以使用该令牌撤销委托&#xff1b;这意味着将从事件取消注册委托&#xff0c;再次引发该事件时不会调用该委托。 为简单起见&#xff0c;上面的代码示例都没有介绍如何执行该操作。 …...

【实用工具】Stirling-PDF: 优质开源的PDF处理工具/编辑工具-含入门安装教程

文章目录 项目简介功能展示Page Operations 页面操作Conversion Operations 转换操作Security & Permissions 安全与权限Other Operations 其他业务 如何安装并使用Docker RunDocker Compose 项目简介 这是一款使用 Docker 的基于本地托管网络的强大 PDF 操作工具。它能让…...

opencv 深度图视差图可视化案例

参考:https://www.cnblogs.com/zyly/p/9373991.html(图片这里面下载的) https://blog.csdn.net/He3he3he/article/details/101053457 原理 双目摄像头 视差公式: 三角形对应推算 深度距离转换: 这里d是视差Disparity 代码 下面两种计算视差方法: import os impor…...

Golang | Leetcode Golang题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; func minPatches(nums []int, n int) (patches int) {for i, x : 0, 1; x < n; {if i < len(nums) && nums[i] < x {x nums[i]i} else {x * 2patches}}return }...

算法训练(leetcode)第五十二天 | Bellman_ford 队列优化算法(SPFA)、BF算法判断负回路、BF之单源有限最短路(有负回路)

刷题记录 94. 城市间货物运输 I-Bellman_ford 队列优化算法&#xff08;SPFA&#xff09;95. 城市间货物运输 II-BF算法判断负回路96. 城市间货物运输 III-BF之单源有限最短路(有负回路) 94. 城市间货物运输 I-Bellman_ford 队列优化算法&#xff08;SPFA&#xff09; 题目地址…...

SpringBoot中整合RabbitMQ(测试+部署上线 最完整)

一、RabbitMQ安装 由于在测试环境中&#xff0c;我们现在虚拟机上基于docker安装mq docker run \-e RABBITMQ_DEFAULT_USERquick \-e RABBITMQ_DEFAULT_PASS123 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network your-net\-d \r…...

算法板子:线性DP——算出三角形中的最大路径值、求最长上升子序列、求最长公共子序列

目录 一、数字三角形——算出三角形中的最大路径值 二、最长上升子序列——求一个数组中的最长递增子序列 三、最长公共子序列——求两个字符串中的最长公共子序列 一、数字三角形——算出三角形中的最大路径值 #include <iostream> using namespace std;const int N …...

【C++】值传递

函数值传递的特点&#xff1a;值传递过程中即使形参改变也不会改变实参 没有返回值的函数用“ void ”定义 下面是一个实例&#xff1a; #include<iostream> using namespace std;//值传递 //定义函数&#xff0c;实现两个数字进行交换函数//如果函数不需要返回值&…...

工业三防平板助力MES系统打造工厂移动式生产管理

随着工业4.0时代的到来&#xff0c;智能制造、数字化车间等概念层出不穷&#xff0c;生产过程的可视化管理也成为了企业提升效率、优化生产的关键。而工业三防平板&#xff0c;凭借其坚固耐用、功能强大、便携易用等特性&#xff0c;成为了实现生产过程可视化管理的重要利器&am…...

keepalived+nginx实现的简单高可用故障转移

keepalived和nginx和适配 nginx服务停止后对keepalived的影响最近研究了一下keepalived绑定虚拟Ip,然后实现集群的方案,发现实现故障转移的模式,只有在keepalived服务整个挂掉后才能实现虚拟IP的漂移,和实际应用的场景不怎么适配,所以把它和nginx结合在一起实现集群高可用…...

openai api使用

1OpenAI 的 API 介绍 1.1 api分类 常用的 OpenAI Api 接口总共分为 4 类&#xff1a;对话类、私有化模型训练类、通用类、图片 & 音频类&#xff0c;其中对话类与私有化模型训练类是最常用的。 a .对话类 这类是最常用也是最核心的接口&#xff0c;用于人机对话。对话类…...

带你走进haproxy的世界

华子目录 前言什么是负载均衡为什么用haproxy负载均衡负载均衡公司负载均衡类型四层负载均衡七层负载均衡四层和七层的区别 haproxy介绍haproxy的安装与服务信息软件安装haproxy基本配置信息proxies配置socat工具 haproxy算法静态算法动态算法其他算法 高级功能及配置基于cooki…...

STM32--中断使用(超详细!)

STM32中断机制是嵌入式系统设计中一个非常重要的组成部分&#xff0c;它允许单片机在执行程序的过程中&#xff0c;对外部或内部发生的事件做出快速响应。以下是一篇关于STM32中断机制的详细介绍和示例代码&#xff0c;希望能够帮助你更好地理解和应用中断。 一、中断的基本概…...

【深度学习实践】基于深度学习的图像去雾算法-ChaIR-实践

本文介绍一个去雾算法ChaIR的使用方法&#xff0c;可以完成图像去雾&#xff0c;也可以用于图像去雨、去噪音等任务。本文不涉及论文原理&#xff0c;只包含源代码的跑通和使用。 先展示一下效果&#xff1a; 原图去雾 论文&#xff1a;Exploring the potential of channel …...

《乳腺密度高的女性中,使用AI辅助的乳腺X线筛查与补充筛查超声的比较研究》| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统

Title 题目 Screening Outcomes of Mammography with AI in Dense Breasts: A Comparative Study with Supplemental Screening US 《乳腺密度高的女性中&#xff0c;使用AI辅助的乳腺X线筛查与补充筛查超声的比较研究》 Background 背景 Comparative performance between…...

crm 销售管理系统有哪些?国内外排名前十盘点

本文深入对比的 crm销售管理系统有&#xff1a;1.纷享销客&#xff1b; 2.Zoho CRM&#xff1b; 3.销售易&#xff1b; 4.有赞CRM&#xff1b; 5.Salesforce&#xff1b; 6.HubSpot&#xff1b; 7.简道云CRM&#xff1b; 8.爱客CRM&#xff1b; 9.Apptivo。 如果你正寻找一种方…...

package-lock.json 要提交到git吗?

之前一直没有提交package-lock.json文件到git仓库&#xff0c;直到我打包失败了。。。 我才知道package-lock.json需要提交到‌git仓库。 ‌ npm官网建议将package-lock.json一起提交到代码库中&#xff0c;不要忽略它。‌ package-lock.json的主要作用是锁定dependencies的版…...

算法学习day32

一、解码方法II&#xff08;解码方法I的升级版&#xff09; 在I的基础上增加了*&#xff0c;可以代替1-9中任意一个数字&#xff0c;求解码的方法有多少种 输入&#xff1a;s "*" 输出&#xff1a;9 解释&#xff1a;这一条编码消息可以表示 "1"、"…...

知识与智慧

前两天在medium上看到一篇文章&#xff0c;探讨知识&#xff08;knowledge&#xff09;和智慧&#xff08;wisdom&#xff09;之间的区别&#xff0c;很受启发&#xff0c;结合自己的经历和理解&#xff0c;形成此文&#xff1a; 何为知识 知识通常指的是信息的积累和对特定领…...

IPFS去中心化存储实战指南:黑马程序员音乐播放器项目开发完整教程

IPFS去中心化存储实战指南&#xff1a;黑马程序员音乐播放器项目开发完整教程 【免费下载链接】BlockChain 黑马程序员 120天全栈区块链开发 开源教程 项目地址: https://gitcode.com/gh_mirrors/blockchain95/BlockChain 你是否想过如何构建一个真正去中心化的音乐播放…...

AArch64内存管理:MAIR_EL3寄存器详解与应用

1. AArch64内存管理基础与MAIR_EL3寄存器定位 在Armv8-A/v9-A架构中&#xff0c;内存管理单元(MMU)通过多级页表实现虚拟地址到物理地址的转换。当处理器执行内存访问时&#xff0c;MMU会遍历页表条目(Translation Table Entry)&#xff0c;其中包含两个关键信息&#xff1a;目…...

机器学习与SHAP在教育公平研究中的应用:精准定位学业困境根源

1. 项目概述&#xff1a;当机器学习遇见教育公平&#xff0c;我们如何精准定位学业困境的根源&#xff1f;在拉丁美洲的教育研究领域&#xff0c;一个长期困扰政策制定者和研究者的核心问题是&#xff1a;究竟是什么因素&#xff0c;在复杂的社会经济背景下&#xff0c;系统性地…...

Burp Suite证书安装全解:HTTPS抓包失败的根源与跨平台命令行方案

1. 为什么必须亲手安装Burp Suite证书——不是“点一下就完事”的操作很多人第一次在手机或测试设备上配置Burp Suite代理时&#xff0c;会下意识认为&#xff1a;只要把电脑上的Burp监听地址填进Wi-Fi代理设置&#xff0c;再用浏览器访问http://burp&#xff0c;点击那个绿色的…...

Burp Suite拦截与替换机制深度解析:从协议层到规则链

1. 这不是“点开就能用”的功能&#xff0c;而是你和目标系统之间的一道可编程闸门很多人第一次在Burp Suite里点开Proxy → Intercept&#xff0c;看到HTTP请求被拦下来&#xff0c;兴奋地改个User-Agent、删个Cookie就点Forward&#xff0c;以为自己已经掌握了“拦截与替换”…...

随机森林算法在儿童出行方式预测中的实战应用与优化

1. 项目概述&#xff1a;用随机森林预测孩子怎么上学做城市交通规划或者做家长接送方案的时候&#xff0c;你肯定想过一个问题&#xff1a;孩子们到底是怎么上学的&#xff1f;是走路、骑车、坐公交还是家长开车送&#xff1f;这个问题看似简单&#xff0c;背后却牵扯到城市规划…...

Web渗透测试能力成长地图:从工具使用到漏洞认知跃迁

1. 这不是工具清单&#xff0c;而是一张Web渗透测试的“能力成长地图”你刚点开这篇文章&#xff0c;大概率正站在两个路口之间&#xff1a;一边是网上铺天盖地的“十大免费扫描器推荐”&#xff0c;点进去全是截图下载链接一句“一键扫漏洞”&#xff0c;结果装完跑两下&#…...

打造XBEE封装BLE112蓝牙模块:硬件设计、射频布局与调试全攻略

1. 项目概述&#xff1a;为什么我们需要一个“XBEE格式”的蓝牙模块&#xff1f;在嵌入式开发和物联网项目中&#xff0c;无线通信模块的选择往往决定了项目的成败。对于很多工程师和创客来说&#xff0c;Silicon Labs&#xff08;芯科科技&#xff09;的BLE112/113模块是蓝牙4…...

统信UOS浏览器书签同步难题?一招搞定所有新用户默认书签配置

统信UOS浏览器书签批量配置&#xff1a;系统管理员的高效部署指南在企业或教育机构的IT运维工作中&#xff0c;统信UOS作为国产操作系统的代表&#xff0c;其浏览器书签的统一管理常常成为系统管理员面临的挑战。想象一下&#xff0c;每当有新员工入职或学生入学&#xff0c;都…...

Unlock-Music:浏览器中一键解锁加密音乐文件的完整指南

Unlock-Music&#xff1a;浏览器中一键解锁加密音乐文件的完整指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: http…...