标准IO及其各函数用法

c语言中的标准IO以及文件IO 阅读详情

目录

综述标准IO与文件IO

1、fopen 函数(打开一个文件)

2、fclose函数(关闭流)

3、读写函数

3.1按字符读写

3.1.1 fgetc函数(从指定流中读取一个字符)

3.1.2 fputc函数(向流中输出一个字符)

3.1.3案例操作

3.2按行读写

3.2.1 fgets函数(按行读文件)

3.2.2 fputs函数(向文件中输出一串字符串)

3.2.3 小结

3.3按块读写

3.3.1 fread函数(按块读取内容)

3.3.2 fwrite函数(按块向流中写入数据)

3.3.3总结

4、perror函数

5、fseek、ftell、rewind函数


综述标准IO与文件IO

标准IO:

使用时在用户空间创建缓冲区,在合适的时机在通过系统调用访问实际的文件,从而减少了使用系统调用的次数。

缓存方式分三种:

行缓冲:\n

全缓冲:缓存区填满内容才会溢出

不缓存:stderr

流:

当使用标准IO打开一个文件时,就会创建一个FILE结构体描述该文件,我们把这个FILE结构体形象的称为流,标准IO函数都是基于流进行各种操作。

文件指针:

指向一个打开文件的指针(硬盘中的文件被拷贝到内存中之后,会以FILE结构体的形态存在,要操作该文件必须使用文件指针)

FILE:

C语言file类,在stdio.h 头文件中,FILE类是一个结构体:定义如下:

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;

通过typedef定义了 文件类型 的别名: “FILE”,这样以后需要读写文件的时候直接就可以用FILE去定义。

文件IO:

1、不带缓存

2、通过文件描述符来访问文件

文件IO与标准IO的区别:

  1. 文件IO又被称为低级磁盘IO,遵循POSIX相关标准,任何兼容POSIX标准的操作系统上都支持文件IO。标准IO被称为高级磁盘IO,遵循ANSI C标准,只要开发环境中有标准C库,就可以使用标准IO。
  2. 文件IO读写文件时,每次操作都会执行相关的系统调用,这样可以直接读取实际文件,但是频繁的系统调用会增加系统的开销。标准IO可以看做是在文件IO的基础上封装了缓冲机制,从而减少了系统调用的次数。
  3. 文件IO中用文件描述符表示一个打开的文件,可以访问不同类型的文件。而标准IO使用流表示一个打开的文件,只能访问普通文件。

再来回顾一下各个文件类型

普通件 -

管道文件 p

链接文件 l

目录文件 d

套接字文件 s

块设备文件 b

字符设备文件 c

1、fopen 函数(打开一个文件)

FILE *fopen(const char *path, const char *mode)

FILE *fopen(要打开的文件路径及文件名, 以何方式打开 )

打开方式:r(只读)、w(只写)、a(追加写入)、r+(读写)、w+(读写)

返回值:成功,返回已经打开的文件流指针,失败返回NULL

2、fclose函数(关闭流)

int fclose(FILE *fp)

int fclose(已经打开的文件流指针)

返回值:

成功,返回0

失败,返回-1(EOF)(end of file,文件尾部的意思)

注意:EOF只能判断是否到文本文件的末尾,不能判断是否到二进制文件的末尾

判断是否关闭的代码

if (fclose(fp) != 0)

{

 printf("Error in closing file %s\n", str1);

}

以下是使用fopen和fclose的案例:

99786363a1b149148d7dfcaa35d6c4c2.png​

9312261c568d4a50af1f62b0383665b0.png​

说明:

 ../2.txt表示上一级目录下的2.txt文件,此处按照实际情况来写就行。

errno.h,该头文件定义了通过错误码来回报错误资讯的宏。errno 宏定义为一个 int 型态的左值, 包含任何函式使用errno功能所产生的上一个错误码。

所以这里用的是%d这个格式控制符。

3、读写函数

当程序运行起来时,有三个文件默认已经打开,标准输入、标准输出、标准出错,对应的流指针分别为:stdin、stdout、stderr,这几个都是从键盘输入,终端输出,此次我们重点介绍的是从文件中读取,以及写入文件中。

3.1按字符读写

getchar( )、putchar( ) 只能从键盘输入

fgetc( )、fputc( ) 从哪里输入都可以:键盘、文件都可输入

3.1.1 fgetc函数(从指定流中读取一个字符)

int fgetc(FILE *stream)

int fgetc(指定的流),参数是读取字符的流来源

这个流可以写stdin,就是从键盘流输入,如果要用其他的流,从文件中读取和写入,需自己定义

返回值:成功返回输出的字符的ASCII值,失败返回-1

这个函数的返回值,是返回所读取的一个字节。如果读到文件末尾或者读取出错时返回EOF 

3.1.2 fputc函数(向流中输出一个字符)

int fputc(int c, FILE *stream);

int fputc(要输出的字符变量名, 要输出到哪的流?);

返回值:成功返回输出的字符的ASCII值,失败返回-1

案例:

7bb1e57875194c0db96cd22236d94206.png​

89e293ac1297454297eb5122b965fd49.png​

说明:

这里用的stdin 是标准输入流、stdout是标准输出流这两个流,以及stderr在程序运行一开始就会自己开启,我们可以直接拿来用,体现的是一种键盘与终端的关系

3.1.3案例操作

用字符的读写模拟完成CP命令,如下:

d1a780e7be6b4c31b20c31f184f357bb.png​

26d0cd5805664727aa200b3d72689aef.png​

3.2按行读写

3.2.1 fgets函数(按行读文件)

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

char *fgets(读到内容放哪个地址, 能放的空间大小, 要操作的流(读它内容))

参数:

     s: 字符型指针,指向存储读入数据的缓冲区的地址

     size: 从流中读入n-1个字符

     stream : 指向读取的流

返回值:

成功,返回读到缓冲区字符串的首地址,

失败,返回NULL,遇到文件结尾也是返回NULL

注意:1、最多读size-1个字节

因为它遇到换行符,会将换行符也读入

3.2.2 fputs函数(向文件中输出一串字符串)

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

int fputs(内存空间的首地址, 要操作的流)

返回值:

成功,返回非负整数

失败,返回-1

3.2.3 小结

总结:fgets和gets有什么区别

fgets比gets安全

fgets会读取换行符,而gets不会

puts和fputs的区别

puts会自动换行,而fputs不会

3.3按块读写

3.3.1 fread函数(按块读取内容)

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

size_t fread(接收保存数据的地址, 要读出内容的单字节数, 要进行读出size字节的数据项的个数, 要操作的流(目标文件指针))

fread函数每次从stream中最多读取nmemb个单元,每个单元大小为size个字节,将读取的数据放到ptr,文件流的指针后移size*nmemb字节。

由于每次移动的是size*nmemb,可以想象成二维变动(有两个变量值),所以我们叫它块读取

54160d0cb7ae4be5908bec1f2d3e2a98.png​ 

fread函数,每一次若读取成功,返回的是nmemb数值(这个值是我们自己设置的),如果返回值比nmemb要小,则可能是出错或者读取结束。

他还说到,fread函数无法区分是出错或者读取结束,需要借助feof函数或者ferror函数去进一步判断。

经验证,fread函数的返回值成功都是返回设定的nmemb值大小,只在最后一次,剩余的量不足以够nmemb,所以会返回一个比nmemb要小的值

84ed0f95851c42fea81fc0ead01aa4a5.png​

 a580883579824c2680ac4b439524fd79.png​

feof函数用于检测是否到达文件末尾,如果到末尾,则返回是一个非零数。

3.3.2 fwrite函数(按块向流中写入数据)

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

size_t fwrite(内存空间首地址, 要写入内容的单字节数, 要进行写入size字节的数据项的个数,要操作的流)

size是sizeof(char),如果是char类型的,后一个参数是总的个数

返回值:

成功,返回写入的块数

失败,返回-1

3.3.3总结

此处用字符读写、按行读写、按块读写,模拟了虚拟机的CP命令,读者可以进行对比学习

文件操作基本步骤:

①打开文件

②操作文件

③关闭文件

#include<stdio.h>
#include<errno.h>
int main(int argc,char *argv[])
{
	//入参检测
	if(argc < 3)
	{
		printf("try again");
		return -1;
	}
	//打开文件
	FILE *fr=fopen(argv[1],"r");
	FILE *fw=fopen(argv[2],"w");
	if((NULL == fr) || (NULL == fw))
	{
		printf("open error:%d\n",errno);
		return -1;
	}
/*
	//文件操作(模拟cp命令,通过字符读写)
	char ch;
	while(1)
	{
		ch = fgetc(fr);	
		if(EOF == ch)
		{
			break;
		}
		fputc(ch,fw);
	}
	//文件操作(模拟CP,通过行读写)
	char buf[10]="0";
	char *p=NULL;
	while(1)
	{
		p=fgets(buf,10,fr);		
		if(NULL == p)
		{
			break;
		}
		fputs(buf,fw);	
	}
*/
	//文件操作(模拟CP,通过块读写)
	char buf[50]="0";
	int test1,test2;
	while(1)
	{
		test1=fread(buf,1,15,fr);
		test2=feof(fr);
		//printf("fread的返回值:%d\n",test1);
		//printf("feof的返回值:%d\n",test2);
		if(test1 < 0)
		{
			perror("fread error");
			return -1;
		}
	    else if(test2 != 0)
		{
			break;
		}
		fwrite(buf,1,15,fw);
	}
	//关闭文件
	fclose(fr);
	fclose(fw);
	return 0;
}

4、perror函数

函数定义:

void perror(const char *s);

使用:

perror ("open_port");

包含头文件(不可以掉了这个头文件):

#include <stdio.h>//包含perror的头文件

功能:perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 设备 (stderr) 。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。

5、fseek、ftell、rewind函数

首先,我们需要知道一点,文件在被操作时,文件指针会在文件内部自己移动

这三个函数都包含于stdio.h头文件中

函数的形式分别为:

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

long ftell(FILE *stream);

Void rewind(FILE *stream);

 函数

功能

返回值

fseek

重定位流上的文件指针

成功返回0

失败返回-1

ftell

获取当前文件指针位置

成功返回文件指针位置

失败返回-1

rewind

将文件内部指针重新指向文件的开头

无返回值 

fseek的 whence参数设置,可以写英文,也可以写0,1,2,分别依次对应

起始点

代表的文件位置

对应数字

SEEK_SET

文件开头

0

SEEK_CUR

文件当前位置

1

SEEK_END

文件末尾

2

C语言中常用的IO接口函数总结 IO接口分为标准IO(库函数)和文件IO(系统调用) 本文总结了标准IO和文件IO常用的接口函数 标准IO:printf scanf fopen fread fwrite fclose fgetc fputc fgets fputs... 文件IO: open read write close... 阅读详情

相关推荐

STM32对I/O的3种操作方式

STM32对I/O的3种操作方式,寄存器操作I/O,库函数操作I/O,位操作I/O。

qq_55843890的博客 3803

标准io函数

标准IO是指c语言标准库中提供的用于对文件进行处理的相关函数和系统IO的区别在于:系统IO系列函数只适用对应的操作系统,linux系统文件IO只适用于linux系统windows系统文件IO只适用于windows系统。

ww22221111的博客 218

标准IO的基础知识及相关函数的用法

本文标准IO的基础知识及相关函数的用法详细的讲述了IO的相关知识,FILE指针以及常见的标准IO常用的接口。 fopen/fclose函数、fgetc/fputc函数、fgets/fputs函数、fread/fwrite函数、sprintf/snprintf/fprintf函数、fseek/ftell/rewind光标操作函数的详细讲述和代码示例,感兴趣的可以了解学习一下。

m0_65835264的博客 370

标准I/O函数

1

yjplovegn的博客 538

Unity实时控制佳能单反拍照全流程(附EDSDK 3.6.1配置避坑指南)

本文详细介绍了在Unity中实时控制佳能单反相机进行拍照的完整流程,重点提供了EDSDK 3.6.1的配置与避坑指南。内容涵盖从SDK获取、环境搭建、相机初始化、参数设置到实现拍照控制,并深入探讨了实时取景的延迟优化方案与资源管理,旨在帮助开发者高效集成专业相机,提升AR/VR及摄影测量等应用的视觉输入质量。

go5gopher的博客 178

jlink v9刷固件修改序列号来修复弹窗

jlink v9弹窗警告修复j

weixin_40500627的博客 9340

01标准io流 函数用法

1.打开流: FILE *fopen (const char *path, const char *mode); 成功时返回流指针;出错时返回NULL 示例 fopen(“test.txt”,“r+”); path 文件路径 mode 打开方式 r: 可读、文件必须已经存在 r+: 可读、可写、文件必须已经存在 w: 可写、文件可以不存在、擦除文件以前的内容 w+: 可读、可写、...

qq_35602425的博客 267

从AXI到CHI:深入解析基于Credit的流量控制如何优化NoC设计

本文深入解析了从AXI握手式流控到CHI基于Credit的流量控制机制的演进。通过对比传统流控的瓶颈,详细阐述了Credit机制如何通过信用预分配和记账系统,有效解决FIFO气泡、时序收敛等难题,从而优化NoC设计的带宽利用率、降低延迟并提升系统可扩展性。

weixin_29227585的博客 517

标准IO编程

标准IO(标准输入输出)是指在程序中使用的输入输出函数库,它提供了一套标准的文件操作函数,如打开文件、读写文件、关闭文件等。这些函数库包括了stdio.h、stdlib.h等头文件中的函数,如fopen、fclose、fread、fwrite等。标准IO还包括了对标准输入stdin、标准输出stdout、标准错误输出stderr的操作。标准 IO 库处理很多细节。例如缓存分配,以优化长度执行 IO 等。

林夕的博客 301

FitzHugh-Nagumo 模型连续-MATLAB仿真

【代码】FitzHugh-Nagumo 模型连续-MATLAB仿真。

qq_43688618的博客 877

PyInstaller打包后在Win7无法运行,提示缺少`api-ms-win-core-path-l1-1-0.dll`问题解决

这个问题的关键在于Python 3.12和Windows 7之间的兼容性问题。解决方法是使用Python 3.8.8版本进行打包,确保程序能够在Windows 7系统上运行。如果你也遇到类似的问题,不妨尝试降级Python版本,看看是否能够解决。希望我的经验能够帮到你!如果你在使用PyInstaller打包时遇到其他问题,欢迎留言讨论。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 981

标准IO函数

上一节的系统IO函数,我们经常使用read()和write()操作很小文件,系统会经常往返用户态和内核态,程序的开销会非常大。如果我们在fopen函数调用时就设置其副模式为O_APPEND即文件读写位置为文件末尾,那么我们就不用fseek函数来设置了。O_DIRECT,fread和fwrite函数就不用写到内核空间的页缓存区了,而直接到磁盘。一个解决办法就是,我们在用户空间也设立一个缓存区,c标准库就是如此。阻塞模式:若文件IO没办法正常读取数据的时候,就会停在休眠状态。用法和系统IO函数类似。

jiazihuangtian的博客 300

十三种通信接口芯片——《器件手册--通信接口芯片》

通信接口芯片用于实现差分信号的传输,具有抗干扰能力强、传输距离远等优点。RS485支持多点通信,可连接多个收发器,而RS422支持单向多点通信。广泛应用于工业自动化、过程控制、仪器仪表、楼宇自动化(如暖通空调、保安系统)、电机控制等领域。ST3485EBDRTP8485ESR用于实现串行通信,支持点对点通信,传输距离相对较短,数据速率较低。常用于计算机与外设(如打印机、调制解调器)之间的通信。如芯力特的SIT3232,可作为ST3232的替代品。

XU157303764的博客 4261

Day21 文件IO 、 标准IO与文件IO的关系 \ 目录IO

rwx:创建该文件用户同组的用户对文件是否拥有读写执行的权限。从文件描述符中读取count个自己数据放入buf对应的空间。是系统调用,是Linux内核中的函数接口。fread/fwrite 二进制操作文件。O_CREAT 文件不存在就创建,需要传入第3个参数。rwx:创建该文件的用户对文件是否拥有读写执行的权限。将buf开始的count个字节写入文件描述符fd中。是库函数,是对文件IO的封装。rwx:其余人是否对文件拥有读写执行的权限。2. 读写文件 write/read。count:最多存放元素的个数。

m0_71562438的博客 1212

020、Sensor 供电设计:AVDD、DVDD、IOVDD 的上电时序与纹波要求

本文总结了图像传感器(Sensor)供电设计中的关键要点与常见问题:1. 三路供电特性差异:AVDD(模拟供电)对纹波最敏感(通常<30mVpp),DVDD需应对大电流瞬态变化,IOVDD需满足MIPI接口电压稳定要求。2. 上电时序至关重要,应遵循"模拟→数字→IO"的启动顺序,时序偏差可能导致初始化失败。3. 纹波控制需合理选择电容组合(如10μF+0.1μF),注意布局走线及电容ESR/ESL特性。4. 调试建议使用示波器多通道测量时序和纹波,重点关注传感器启动瞬间的电源特性。5. 经验教训包括预留设

sundong_81的博客 506

系统建模语言 (SysML)

系统建模语言

追赶时代的博客 745

IO相关,标准输入输出及错误提示

操作系统的概念:向下统筹控制硬件,向上为用户提供接口。操作系统的组成 = 内核 + 外壳(shell)linux的五大功能:进程管理、内存管理、文件管理、设备管理、网络管理。最早接触的IO:printf -- 标准输出scanf -- 标准输入。

2303_78438820的博客 868

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

标准IO(1)

1.标准IO的介绍: 标准IO库由ANSI C标准说明 标准IO在UNIX上是对文件IO的封装 IO:Input,Output 2.流和FILE对象: FILE:每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE FILE 结构定义的对象 FILE * 称之为流对象,也叫文件流指针。 流 (stream...

weixin_44822209的博客 170

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

关于标准IO(APUE)

标准IO,缓冲需要注意的 这里的知识和文件IO挺想通的,复习完文件IO,对这里理解清楚了很多,之前看的云里雾里的。 感觉这里整理清楚文件、文件描述符、流、文件指针(FILE对象)就容易很多了。还有就是各个函数的详解(作用、返回值、参数、出错判断相关) 接着把问题整理在下面吧,然后抽空考自己一下,哈哈哈哈哈有人看到觉得有更深的问题提出来就好了。 文件io和标准io的主要不同 流是什么,流的定向是什...

weixin_42352795的博客 348

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Linux学习】标准IO库

标准IO库简介和文件操作,使你了解函数文件操作方法

嵌入式、 833

IO进程----标准IO

IO进程中的标准IO学习

D1557329860的博客 1174

标准IO.

I: 键盘是标准输入设备 ====》默认输入就是指键盘 /dev/inputO: 显示器是标准输出设备 ==》默认输出就是指显示器linux中一切都是文件。文件用来存储数据(数据,指令)。IO输入输出,操作对象是用 命令 ll 来查看文件权限用一种特殊的符号表示法来描述,通常可以看到类似rwxrwxrwx这样的权限字符串,以及它们对应的数字表示法111111111。这些符号和数字分别对应着文件或目录的读、写、执行权限,以及对这些权限的拥有者(用户)、所属组和其他用户的不同权限设定。

l22221的博客 735

Go 标准库介绍五: io

本文介绍Go 标准库 io 常用的导出函数,结构体和方法。

ironxu的专栏 2380

Linux下标准IO接口和系统调用IO接口结构和用法详解

标准IO接口 1. fopen 和 fclose 函数 作用:打开指定文件和关闭指定文件 FILE * fopen ( const char *pathname, const char *type); pathname : 想要打开的文件名称和路径 type :文件的打开方式 返回值 : 成功返回文件指针,失败返回NULL FILE * fclose ( const char *pathname...

m1059247324的博客 598

(九)linux下文件io与c的标准io对比

一.c的标准ioc函数中就有遵循ANSIC 带缓冲 文件IO遵循POSIX操作系统移植方便无缓冲。 二.标准空通过流即FILE,而文件IO是通过文件描述符fd,也是一组函数,只在遵循posix操作系统下使用。 三.linux中标准io基于文件io实现。每个打开的文件对应一个文件描述符,从0开始依次递增。 四.open函数在fcntl.h中(const *path,int oflag,...)

不文东的博客 623

【IO】(标准IO、文件IO类1)函数使用汇总(fopen、fclose、fgetc、fputc、fgets、fputs、sprintf、fscanf、freadfwrite...)

汇总一下这些IO的函数的原型、例子、功能以及返回值,真的有些很容易混淆,记录学习,后续的函数慢慢全部汇总在这篇笔记里,以巩固自己的基础:fopen、fclose、fgetc、fputc、fgets、fputs、sprintf、fscanf、freadfwrite、open、close、read、write...

2301_77133426的博客 1822
上一篇: 数组指针的使用方法
下一篇: 文件IO及其函数使用
翔在天上飞
博客等级 码龄7年 298粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翔在天上飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值