c标准IO

c标准IO

标准IO和文件的相关操作,基本上都是以f开头的一系列函数。

标题操作对象IO缓冲区手册位置
系统IO文件描述符,数组下标不带IO缓冲区调用系统库函数接口,基本来自于man 2手册
标准IO文件流指针,文件指针携带IO缓冲区调用系统库函数接口,基本来自于man 3手册

系统IO在打开文件之后,会得到文件的描述符,文件操作基本围绕着文件描述符进行。
标准IO在打开文件之后,会得到文件流的指针,文件操作基本围绕着文件流指针进行。

fopen文件打开

#include <stdio.h>
函数原型:
//通过文件路径打开文件
FILE * fopen(const char *path,const char *mode);
//通过文件描述符打开文件
FILE * fdopen(int fd,const char *mode);
函数参数:
const char *path:需要打开的文件路径名
int fd:需要打开的文件的文件描述符
const char *mode:打开文件的权限
返回值:
成功:返回值一个文件流指针
失败:返回NULL
//以路径的形式打开文件FILE *fp = fopen("test.txt", "r");if (fp == NULL){perror("fopen");return -1;}printf("打开文件之后的指针地址:%p\n",fp );

在调用fopen时,文件的打开方式是必须的,最基本的文件打开方式有以下几种:

打开方式说明
r以只读的方式打开文件。只允许读取,不允许写入,文件必须存在,否则打开失败
w以写入的方式打开文件,如果文件不存在,那么创建一个新的文件如果文件存在,那么清空文件内容(相当于删除源文件,创建一个新文件)
a以追加的方式打开文件,如果文件不存在,那么创建一个新文件如果文件存在,那么将写入的数据追加到文件末尾(文件原有内容会保留)
r+以读写的方式打开文件,及可以读取也可以写入,文件必须存在,否则打开失败
w+以写入/更新的方式打开文件,相当于w和r+的叠加效果,既可以读取也可以写入,如果文件不存在,那么创建一个新的文件,如果文件存在,就清空文件内容
a+以追加/更新的方式打开文件,相当于a和r+的叠加效果,既可以读取也可以写入,如果文件不存在,那么久创建一个新文件如果文件存在,那么就将写入的数据追加到文件末尾
t文本文件,如果不写默认为 t
b二进制文件

读写权限和读写方式可以组合使用,但是必须将读写方式放在读取权限的中间或者末尾
1.将读写方式放到读写权限的末尾:rb、wt、r+b、a+t
2.将读写方式放在读写权限的中间:rb+、wt+、ab+

整体来说,文件打开方式由:r、w、a、t、b、+六个字符拼成,各个字符的含义:

  • r读
  • w写
  • a追加
  • t文本文件
  • b二进制文件
  • +读和写

文件的关闭fclose()

#include <stdio.h>
函数原型:
int fclose(FILE * stream);//函数参数为fopen返回的文件指针
返回值:
成功:返回0
失败:返回EOFEOF实际上是-1
在stdio.h头文件中查看EOF的值
cat /usr/include/stdio.h
int ret=fclose(fp);if(ret==EOF){perror("文件关闭失败!");return -1;}

文件数据块读写

#include <stdio.h>
数据块读取的函数原型:
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:需要多少块这样的存储区
stream:文件流指针对象函数的返回值:
成功:返回读取或者写入的有效数据块的个数
失败:返回0或者其他小于0的数据
#include <stdio.h>
#include <string.h>int main(int argc, char const *argv[])
{//以可读可写的方式打开文件FILE *fp=fopen(argv[1],"r+");if(fp==NULL){perror("文件打开失败!");return -1;}//读取数据char buf[100];//存储读取的数据//读取数据,每个空间2个字节,读取4块这样的内存int ret=fread(buf,2,4,fp);//读取数据,每个空间10个字节,读取10块这样的内存//int ret=fread(buf,10,10,fp);printf("buf:%s    ret:%d\n",buf,ret );//关闭ret=fclose(fp);if(ret==EOF){perror("文件关闭失败!");return -1;}return 0;
}

判断文件操作feof和ferror

int feof(FILE * stream);
返回值:
成功:返回非0值,找到了文件的末尾
失败:返回0值,说明文件没有到达末尾//判断操作过程中是否出现错误
int ferror(FILE * stream);
返回值:
成功:返回非0值,存在操作错误
失败:返回0值,说明没有错误
#include <stdio.h>
#include <string.h>int main(int argc, char const *argv[])
{FILE *fp1=fopen(argv[1],"r+");FILE *fp2=fopen(argv[2],"r+");if(fp1==NULL||fp2==NULL){perror("文件打开失败!");return -1;}char buf[100];//存放读取内容int ret,rat;while(1){//每次读取之前,先清理一下缓冲区(数组)memset(buf,0,100);//保证buf中没有上次读取出来的残留数据fread(buf,1,1,fp1);//每次读取1个字节//判断文件是否到达末尾ret=feof(fp1);//判断读取的时候是否出错rat=ferror(fp1);printf("eof:%d    error:%d\n",ret,rat );//如果读取到了文件的末尾,结束循环if(ret!=0){break;}//写入数据fwrite(buf,1,1,fp2);}ret=fclose(fp1);if(ret==EOF){perror("文件关闭失败!");return -1;}ret=fclose(fp2);if(ret==EOF){perror("文件关闭失败!");return -1;}return 0;
}

数据字节和行处理-输入相关

#include <stdio.h>
int fgetc(FILE * stream);//输入单个字节到stream流中char * fgets(char * s,int size,FILE * stream);
//输入字符串到stream流中int getc(FILE * stream);//输入单个字符到stream流中函数返回值:
fgetc()		getc()
成功:获取字符或无符号字符    
失败:返回EOF或者读取到文件末尾fgets()
成功:返回读到的字符串指针
失败:返回NULL

数据字节和行处理-输出相关

#include <stdio.h>
int fputc(int c,FILE * stream);//输出一个字符c到stream流int fputs(const char * s,FILE * stream);
//输出一个字符串到stream流中int putc(int c,FILE * stream);//输出一个字符串c到stream流函数参数:
int c:单个操作字符
const char * s:字符串对象s
FILE * stream:文件指针返回值:
fputc()		fputs()
成功:返回写入的字符或者无符号字符
失败:返回EOFfputs()
成功:返回操作的字符串个数
失败:返回EOF

文件偏移fseek

#include <stdio.h>//按照自身需求定位不同的位置
int fseek(FILE * stream,long offset,int whence);//函数调用成功返回当前位置
long ftell(FILE * stream);//将偏移设置到文件的开头 fseek(stream,0,SEEK_SET)
void rewind(FILE * stream);函数参数:
FILE * stream:需要操作的文件流指针
long offset:需要偏移的长度,单位字节
int whence:偏移的起始位置SEEK_SET文件的开头SEEK_CUR文件当前的位置SEEK_END文件的末尾返回值:
fseek()成功:返回0	失败:返回-1
ftell()成功:返回当前偏移的位置
rewind()无返回值数据
#include <stdio.h>int main(int argc, char const *argv[])
{FILE * fp=fopen(argv[1],"r+");if(fp==NULL){perror("文件打开失败!");return -1;}fwrite("helloworld",10,1,fp);//将光标定位到文件开头//rewind(fp);//fseek(fp,0,SEEK_SET);//光标定位到文件的开头//fseek(fp,0,SEEK_END);//光标定位到文件的末尾//fseek(fp,-5,SEEK_END);//光标定位在离文件末尾向前偏移5个字节fseek(fp,5,SEEK_SET);//光标定位在离文件开头向后偏移5个字节char buf[20]={0};fread(buf,10,2,fp);printf("buf:%s\n",buf );long size=ftell(fp);printf("size:%ld\n",size );//关闭int ret=fclose(fp);if(ret==EOF){perror("文件关闭失败!");return -1;}return 0;
}

字符串格式化处理fprintf /fscanf

sprintf()按照一定的格式拼接数据保存到对应的字符串中
int sprintf(char *str,const char * format,...);
函数参数:
char *str:字符串地址
const char * format:字符串操作格式
...:变参数据,变参的内容由格式化内容决定按照一定的格式拼接数据保存到stream对应的文件流中
int fprintf(FILE * stream,const char * format,...);
函数参数:
FILE * stream:需要用来保存数据的文件流指针
const char * format:字符串操作格式
...:变参数据,变参的内容由格式化内容决定
sscanf按照一定的格式从字符串拆分数据保存到变量空间
int sscanf(const char *str,const char * format,...);fscanf按照一定的格式从文件中拆分数据保存到变量空间
int fscanf(FILE * stream,const char * format,...);
#include <stdlib.h>struct student
{char name[10];int age;float high;
};int main()
{char * str="姓名:jack 年龄:19 身高:180.50";struct student stu;sscanf(str,"姓名:%s 年龄:%d 身高:%f",stu.name,&stu.age,&stu.high);printf("%s %d %.2f\n",stu.name,stu.age,stu.high );FILE * fp=fopen("6.txt","r+");if(fp==NULL){perror("文件打开失败!");return -1;}struct student stu1;fscanf(fp,"姓名:%s 年龄:%d 身高:%f",stu1.name,&stu1.age,&stu1.high);printf("%s %d %.2f\n",stu1.name,stu1.age,stu1.high );int ret=fclose(fp);if(ret==EOF){perror("文件关闭失败!");return -1;}return 0;
}

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

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

相关文章

HTMLCSS:呈现的3D树之美

效果演示 这段代码通过HTML和CSS创建了一个具有3D效果的树的图形&#xff0c;包括分支、树干和阴影&#xff0c;通过自定义属性和复杂的变换实现了较为逼真的立体效果。 HTML <div class"container"><div class"tree"><div class"…

XingHan-Team团队官网系统源码 全开源

XingHan-Team 官网程序是一个现代化的企业官网管理系统&#xff0c;由星涵网络工作室开发。 本系统提供了完整的网站内容管理功能&#xff0c;包括用户管理、内容发布、成员查询、成员申请等功能。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/8995…

JAVA:常见 JSON 库的技术详解

1、简述 在现代应用开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已成为数据交换的标准格式。Java 提供了多种方式将对象转换为 JSON 或从 JSON 转换为对象&#xff0c;常见的库包括 Jackson、Gson 和 org.json。本文将介绍几种常用的 JSON 处理…

【贪心】【可行范围内最大边界】SCNU习题 P25.跳跃游戏

算法思想&#xff1a; 每次迭代更新可行至的最大范围r(r必保证>原位置&#xff09;&#xff0c;至到迭代结束&#xff0c;若r>length of array则说明可以跳跃至此 #include <iostream> #include <vector> #include <string> #include <sstre…

Redis 组网方式入门

文章目录 一、组网方式1. 单实例模式描述优点缺点适用场景 2. 主从复制模式&#xff08;Master-Slave Replication&#xff09;描述优点缺点适用场景基于docker的redis主从复制1. 配置主节点2. 配置从节点3. 查看节点状态4. 验证主从数据同步5. 查看同步进度 3. 哨兵模式&#…

【系统集成项目管理工程师教程】第5章 软件工程

软件工程是一门研究用工程化方法构建和维护有效、实用和高质量软件的学科&#xff0c;涵盖软件需求、设计、实现、测试、部署交付、质量管理和过程能力成熟度等方面&#xff0c;旨在提高软件生产率、质量并降低成本&#xff0c;确保软件项目的成功开发与维护。 5.1软件工程定义…

PowerDesigner使用教程:设置注释、默认值属性

使用场景: 进行表设计时&#xff0c;我们需要对字段增加注释、设置默认值 解决方案&#xff1a; 如下图设置即可实现

如果 MySQL 主库出现了问题,从库该何去何从呢?

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀 🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷于探索一些框架源码和算法技巧奥秘,还乐于分享这些宝贵的知识和经验。 💡 无论你是刚刚踏…

C# 日志框架 NLog、log4net 和 Serilog对比

文章目录 前言NLog、log4net 和 Serilog 三个框架的详细对比:一、NLog优点:缺点:二、 log4net优点缺点三、Serilog优点缺点四、Serilog使用举例总结前言 NLog、log4net 和 Serilog 三个框架的详细对比: NLog、log4net 和 Serilog 是三个非常流行的 .NET 日志框架,它们各自…

本地缓存库分析(四):fastcache

文章目录 本系列前言设计索引和数组怎么判断是否被覆盖其他问题 源码走读数据结构setget 总结 本系列 本地缓存库分析&#xff08;一&#xff09;&#xff1a;golang-lru本地缓存库分析&#xff08;二&#xff09;&#xff1a;bigcache本地缓存库分析&#xff08;三&#xff0…

安科瑞5G基站直流叠光监控系统-安科瑞黄安南

基站现状和趋势 5G基站是专门提供5G网络服务的公用移动通信基站。5G基站主要用于提供5G空口协议功能&#xff0c;支持与用户设备、核心网之间的通信。按照逻辑功能划分&#xff0c;5G基站可分为5G基带单元与5G射频单元&#xff0c;二者之间可通过CPRI或eCPRI接口连接。 2019年…

Pr 视频效果:过渡

效果面板/视频效果/过渡 Video Effects/Transition Adobe Premiere Pro 的视频效果中&#xff0c;过渡 Transition效果组用于创建单个剪辑内过渡效果的一组视频效果。这些效果可以增强视频的视觉连贯性&#xff0c;添加创意性的视觉转换&#xff0c;为观众提供流畅的观看体验。…

DataX 的安装配置和使用 (详细版)

1&#xff0c;上传解压 1&#xff0c;开始上传安装包到你虚拟机上放置安装包的文件夹 2&#xff0c;开始解压 ,配置环境变量 1、上传 /opt/modules 2、解压 tar -zxvf datax.tar.gz -C /opt/installs 3、修改 vi /etc/profile 配置环境变量&#xff1a; export DAT…

zookeeper安装

安装之前&#xff1a;先关闭三台服务器的防火墙&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; systemctl stop firewalld systemctl disable firewalld 1)上传 /opt/modules下面 2&#xff09;解压 /opt/installs下面 tar -zxvf zookeeper-3.4.10.tar.gz …

Nature文章《deep learning》文章翻译

这篇文章是对Nature上《deep learning》文章的翻译。原作者 Yann LeCun, Yoshua Bengio& Geoffrey Hinton。 这篇文章的中心思想是深入探讨深度学习在机器学习中的革命性贡献&#xff0c;重点介绍其在特征学习、监督学习、无监督学习等方面的突破&#xff0c;并阐述其在图…

动态规划—整数拆分

class Solution {public int integerBreak(int n) {int[] dp new int[n1];dp[2] 1;for(int i 3; i< n; i){for(int j 1; j< i/2; j){//j拆i&#xff0c;只需要遍历到 i/2 就可以&#xff0c;后面没有必要遍历dp[i] Math.max(dp[i], Math.max(j*(i-j) , j*dp[i-j]));…

OceanBase V4.3.3,首个面向实时分析场景的GA版本发布

在10月23日举办的 OceanBase年度发布会 上&#xff0c;我们怀着激动之情&#xff0c;正式向大家宣布了 OceanBase 4.3.3 GA 版的正式发布&#xff0c;这也是OceanBase 为实时分析&#xff08;AP&#xff09;场景打造的首个GA版本。 2024 年初&#xff0c;我们推出了 4.3.0 版本…

儿童安全座椅行业全面深入分析

儿童安全座椅就是一种专为不同体重&#xff08;或年龄段&#xff09;的儿童设计&#xff0c;将孩子束缚在安全座椅内&#xff0c;能有效提高儿童乘车安全的座椅。欧洲强制性执行标准ECE R44/03的定义是&#xff1a;能够固定到机动车辆上&#xff0c;带有ISOFIX接口、LATCH接口的…

算法笔记:Day-09(初始动态规划)

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 …

HTTP和HTTPS 的作用和应用场景 (python 爬虫简单入门)

HTTP和HTTPS HTTP HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;&#xff1a;是一种发布和接收 HTML页面的方法。 HTTP的端口号为80 HTTPS HTTPS&#xff08;Hypertext Transfer Protocol over Secure Socket Layer&#xff09;…