文件操作函数全集 Linux C(流式 I/O)

【linux系统编程】C标准I/O函数和系统无缓冲函数(Unbuffered I/O函数)关系 先接收一下,本文章主要内容: 1.C标准I/O函数和系统无缓冲函数(Unbuffered I/O函数)关系; 2.I\O函数:buffer && unbuffer; 开始前,我们要清楚linux下C编程与WIN下C编程是不一样的,我们这片文章是linux下C编程,WIN下我并没有进行代码等相关测试。 其次,我们来区分一下C标准I/O函数和C标准I/O函数这两个函数的概念: C标准I/O函 阅读详情

在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。

一、流式文件操作

  这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:

typedef struct {

int level; /* fill/empty level of buffer */

unsigned flags; /* File status flags */

char fd; /* File descriptor */

unsigned char hold; /* Ungetc char if no buffer */

int bsize; /* Buffer size */

unsigned char _FAR *buffer; /* Data transfer buffer */

unsigned char _FAR *curp; /* Current active pointer */

unsigned istemp; /* Temporary file indicator */

short token; /* Used for validity checking */

} FILE; /* This is the FILE object */

  FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能

fopen() 打开流

fclose() 关闭流

fputc() 写一个字符到流中

fgetc() 从流中读一个字符

fseek() 在流中定位到指定的字符

fputs() 写字符串到流

fgets() 从流中读一行或指定个字符

fprintf() 按格式输出到流

fscanf() 从流中按格式读取

ferror() 发生错误时返回其值

rewind() 复位文件定位器到文件开始处

remove() 删除文件

fread() 从流中读指定个数的字符

fwrite() 向流中写指定个数的字符

tmpfile() 生成一个临时文件流

tmpnam() 生成一个唯一的文件名

  下面就介绍一下这些函数

1.fopen()

  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能

为使用而打开一个流 ;把一个文件和此流相连接;给此流返回一个FILR指针

参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表

"r" 以只读方式打开文件                   "w" 以只写方式打开文件               "a" 以追加方式打开文件

"r+" 以读/写方式打开文件,如无文件出错             "w+" 以读/写方式打开文件,如无文件生成新文件

系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。

此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。

例:  FILE *fp;

  if(fp=fopen("123.456","wb"))

    puts("打开文件成功");

  else

    puts("打开文件成败");

3.fputc()向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。例:fputc('X',fp);

4.fgetc()从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。

例:char ch1=fgetc(fp);

5. fseek()此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是

符号常量 值 基准位置

SEEK_SET 0 文件开头

SEEK_CUR 1 当前读写的位置

SEEK_END 2 文件尾部

例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)

  fseek(fp,0L,2);//把读写位置移动到文件尾

6.fputs() 写一个字符串到流中,原型int fputs(const char *s, FILE *stream);

例:fputs("I Love You",fp);

7.fgets()从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。

例:如果一个文件的当前位置的文本如下

Love ,I Have

But ........

如果用 fgets(str1,4,file1);  则执行后str1="Lov",读取了4-1=3个字符,而如果用 fgets(str1,23,file1);

则执行str="Love ,I Have",读取了一行(不包括行尾的'n')。

8.fprintf()按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了.例:fprintf(fp,"%2d%s",4,"Hahaha");

9.fscanf() 从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。例:fscanf(fp,"%d%d" ,&x,&y);

10.feof() 检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);

例:if(feof(fp))printf("已到文件尾");

11.ferror() 原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream); 例:printf("%d",ferror(fp));

12.rewind()把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);例:rewind(fp);

12.remove() 删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。

例:remove("c:io.sys");

13.fread()  从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。

例:char x[4230];

  FILE *file1=fopen("c:msdos.sys","r");

  fread(x,200,12 ,file1);//共读取200*12=2400个字节

14.fwrite() 与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。

例:char x[]="I Love You";

  fwire(x, 6,12,fp);//写入6*12=72字节

  将把"I Love"写到流fp中12次,共72字节

15.tmpfile() 其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。例:FILE *fp=tmpfile();

16.tmpnam();其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。例:tmpnam(str1);

二、直接I/O文件操作

函数 说明

open() 打开一个文件并返回它的句柄

close() 关闭一个句柄

lseek() 定位到文件的指定位置

read() 块读文件

write() 块写文件

eof() 测试文件是否结束

filelength() 取得文件长度

rename() 重命名文件

chsize() 改变文件长度

下面就对这些函数一一说明:

1.open()打开一个文件并返回它的句柄,如果失败,将返回一个小于0的值,原型是int open(const char *path, int access [, unsigned mode]); 参数path是要打开的文件名,access是打开的模式,mode是可选项。表示文件的属性,主要用于UNIX系统中,在DOS/WINDOWS这个参数没有意义。其中文件的打开模式如下表。

符号 含义 符号 含义 符号 含义

O_RDONLY 只读方式 O_WRONLY 只写方式 O_RDWR 读/写方式

O_NDELAY 用于UNIX系统 O_APPEND 追加方式 O_CREAT 如果文件不存在就创建

O_TRUNC 把文件长度截为0 O_EXCL 和O_CREAT连用,如果文件存在返回错误 O_BINARY 二进制方式

O_TEXT 文本方式

对于多个要求,可以用"|"运算符来连接,如O_APPEND|O_TEXT表示以文本模式和追加方式打开文件。

例:int handle=open("c:msdos.sys",O_BINARY|O_CREAT|O_WRITE)

2.close()关闭一个句柄,原型是int close(int handle);如果成功返回0 .例:close(handle)

3.lseek() 定位到指定的位置,原型是:long lseek(int handle, long offset, int fromwhere);参数offset是移动的量,fromwhere是移动的基准位置,取值和前面讲的fseek()一样,SEEK_SET:文件首部;SEEK_CUR:文件当前位置;SEEK_END:文件尾。此函数返回执行后文件新的存取位置。

例:lseek(handle,-1234L,SEEK_CUR);//把存取位置从当前位置向前移动1234个字节。

  x=lseek(hnd1,0L,SEEK_END);//把存取位置移动到文件尾,x=文件尾的位置即文件长度

4.read() 从文件读取一块,原型是int read(int handle, void *buf, unsigned len);参数buf保存读出的数据,len是读取的字节。函数返回实际读出的字节。例:char x[200];read(hnd1,x,200);

5.write()写一块数据到文件中,原型是int write(int handle, void *buf, unsigned len);参数的含义同read(),返回实际写入的字节。例:char x[]="I Love You";write(handle,x,strlen(x));

7.eof()类似feof(),测试文件是否结束,是返回1,否则返回0;原型是:int eof(int handle);

例:while(!eof(handle1)){……};

8.filelength() 返回文件长度,原型是long filelength(int handle);相当于lseek(handle,0L,SEEK_END)

例:long x=filelength(handle);

9.rename() 重命名文件,原型是int rename(const char *oldname, const char *newname); 参数oldname是旧文件名,newname是新文件名。成功返回0 。例:rename("c:config.sys","c:config.w40");

10.chsize(); 改变文件长度,原型是int chsize(int handle, long size);参数size表示文件新的长度,成功返回0,否则返回-1,如果指定的长度小于文件长度,则文件被截短;如果指定的长度大于文件长度,则在文件后面补''。

例:chsize(handle,0x12345);

如果熟悉汇编可能会发现这种方式和汇编语言的DOS功能调用句柄式文件操作很像,比如open()就像DOS服务的3CH号功能调用,其实这种操作还有两种类型的函数就是直接用DOS功能来完成的,如_open(),_dos_open()等等。有兴趣可自已查询BCB的帮助。

  同流式文件操作相同,这种也提供了Unicode字符操作的函数,如_wopen()等等,用于9X/NT下的宽字符编程,有兴趣可自已查询BCB的帮助。

  另外,此种操作还有lock(),unlock(),locking()等用于多用户操作的函数,但在BCB中用得并不多,我就不介绍了,但如果要用C来写CGI,这些就必要的常识了,如果你有这方面的要求,那就得自已好好看帮助了。

 

LPC里的ansi.h LPC里的ansi.h,与标准C和C++稍有不同,细心的朋友可以仔细研究一下 立即下载

相关推荐

4.图像sensor的特性和驱动解析

例子:sensor驱动自己提供操作曝光时间的函数和获取曝光时间的函数,然后将这个函数注册到ISP库和3A算法库,3A算法库根据外部光照强度计算出一个Sensor曝光时间的设置值,ISP库得到这个设置值,然后通过Sensor之前注册的回调函数,把这个值设置到Sensor的硬件寄存器中去,实现整个过程。是为 ISP 配置正确的输入时序。(1)修改驱动源码(sambashar\Hi3518E_SDK_V1.0.3.0\package\mpp\component\isp\sensor\ar0130)

weixin_53762042的博客 3566

C语言文件操作函数(ANSI)

在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。一、流式文件操作  这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:typedef struct {int level; /* fill/empty level of buffer */unsigned flags; /* File status fla

青城的专栏 1770

用Matlab系统辨识工具箱搞定温控系统建模:从阶跃响应到传递函数(附完整代码)

本文详细介绍了如何使用Matlab系统辨识工具箱进行温控系统建模,从阶跃响应数据采集到传递函数参数辨识的全过程。通过实际案例和完整代码,帮助工程师快速掌握PID控制参数整定技巧,提升温控系统设计效率。特别适合单片机开发者和自动化控制工程师参考。

weixin_30736301的博客 309

ansi.h的源码及注释翻译

此部分源码为Minix系统下include目录下的ansi.h文件源码,内容如下: /*The header attempts to decide whether the compiler has enough * conformance to Standard C for Minix to take advantage of.If so,the * symbol _ANSI is def

qpc411074777的专栏 2757

手把手教你用UM982搭建厘米级RTK定位系统(附避坑指南)

本文详细介绍了如何使用UM982模组搭建厘米级RTK定位系统,涵盖硬件连接、软件配置和深度优化技巧。UM982支持BDS、GPS、GLONASS和Galileo等多系统全频点信号,特别适合精准农业、无人机导航等高精度应用场景。通过实战案例和避坑指南,帮助开发者快速实现厘米级定位精度。

y7z8a的博客 1407

轨迹规划——带抛物线过渡的直线插补

带抛物线过渡的直线插补

doudou2weiwei的博客 1984

include/ansi.h

   ansi.h : 测试编译器是否符合ISO规定的标准C要求(ANSI C)

XSlacker的专栏 1407

GAMES101:MacOS作业环境搭建

查看gcc/clang的位置产看gcc/clang的版本1.1.2 安装cmake。

weixin_38844255的博客 715

MINIX源码ansi.h

/* The <ansi.h> header attempts to decide whether the compiler has enough * conformance to Standard C for Minix to take advantage of. If so, the * symbol _ANSI is defined (as 31459). Otherwise _ANS

qq_33544335的博客 696

R语言绘制森林图

运行上述代码后,将会生成一个标题为"森林图示例"的森林图。通过以上代码示例,你可以根据自己的数据集和需求创建定制的森林图。在实际应用中,你还可以进一步调整图形的样式,添加图例、坐标轴标签等,以使森林图更加美观和易于理解。在数据可视化领域,森林图是一种常用的图形类型,用于展示多个分类变量之间的关系。本文将介绍如何使用R语言创建森林图,并提供相应的源代码示例。森林图通常由垂直的线段表示不同类别的观测值,并且线段的长度表示数值变量的大小。上述代码中,我们为不同的类别分别指定了蓝色和红色作为颜色映射关系。

TechNovaX的博客 1045

避坑指南!YOLO26模型导出/推理常见问题,99%的开发者都踩过

版本锁定:Ultralytics=8.4.2、OpenVINO=2024.0.0、Python=3.10,版本不一致是80%问题的根源;参数对齐:训练/导出/推理的imgsz、归一化、坐标映射必须完全一致,差一步就出错;算子统一:避免自定义算子,优先用YOLO26原生算子(C3k2/PSABlock),确保推理引擎兼容;分步验证:导出后先校验ONNX/IR模型→单图片推理→RTSP流推理→72小时稳定性测试,一步过易踩坑;工业级测试。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 510

万字深剖 Linux I/O 原理

带你一命通关 Linux IO 原理 十分钟手撕底层内涵

qq_61500888的博客 1万+

【Java基础篇】Java重要特性,JDK,JRE,JVM区别和联系,环境变量

JDK使用时的执行流程: • 开发者视角(需要开发java程序):需要安装JDK a. 首先使用JDK调用Tools&Tool APIs(开发者工具)编写好Java程序--xxx.java b. 再次调用Tools&Tool APIs中的javac.exe(编译程序)来编译.java文件(将java文件编译成字节码.class文件) c. 调用java.exe来启动JRE d. 在JRE上运行JAVA字节码(加载特定的.class文件,调用这个class文件中的main方法

Yaoyao2024的博客 2163

Linux-C 文件操作

Linux-C 文件操作 一、简述 记--Linux环境下C语言编程的文件操作。 两种操作文件的方式: 1、系统I/O:系统调用接口,open(), read(), write(), lseek(), close()。是操作系统直接提供的编程接口(API)。 2、标准/IO:标准库的I/O函数,fopen(), frea...

Genven_Liang的博客 4万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C语言标准I/O与Linux系统调用的文件操作

打开文件 → 读写操作 → 关闭文件。

guaixiaohuo的博客 2395

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Linux/C++文件篇(一) 】标准I/O与文件I/O基础 :一文掌握文件操作的核心

本文深入解析了C/C++中的标准I/O与文件I/O系统。标准I/O通过流抽象和缓冲区机制提高效率,适合常规文件操作;文件I/O直接使用系统调用,无缓冲但更底层灵活。文章详细对比了两者的特性差异、适用场景,并提供了丰富的代码示例演示各种I/O函数的使用方法(如fopen/fclose、read/write等),以及缓冲区管理、文件定位等关键技术要点。最后给出了选择建议:标准I/O适合常规操作和可移植需求,文件I/O适合底层控制和高性能场景。

2501_93095927的博客 3890

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

[C++/Linux] 网络I/O处理

I/O处理

weixin_73951752的博客 2347

【Linux C | I/O模型】IO复用 | select、pselect函数详解及例子代码(看完就会用了)

👉本文先是介绍select函数,然后介绍使用select的步骤,并给出了使用select的C语言例子,最后介绍了pselect函数并给出C语言使用例子。

wkd_007的博客 3067

标准I/O文件操作

本文介绍了标准I/O文件操作的基础知识,包括文件概念、缓冲机制、分类及操作步骤。重点讲解了文件打开(fopen)和关闭(fclose)函数的使用方法,以及三种文件读写方式:单字符读写(fgetc/fputc)、行读写(fgets/fputs)和数据块读写(二进制文件访问)。文章还提供了文件拷贝的字符版和行处理版实现示例。最后强调了文件操作必须遵循"打开-处理-关闭"的基本流程,确保程序稳定性和数据安全性。

Dd000110的博客 1048

Linux之文件I/O编程

在Linux中,为了保护内核空间,将程序的运行空间分成了内核空间和用户空间(内核态和用户态),它们运行在不同的级别上。逻辑上是相互隔离的。通常情况下,用户进程是允许访问内核的数据,也没有办法直接调用内核函数。只能在用户空间操作用户数据、调用用户空间的函数。操作系统为用户提供了两个接口:1、用户编程接口API:用户利用这些操作命令来组织和控制任务的执行和管理计算机系统。2、系统调用:请求操作系统提供服务。利用软中断机制向内核提交请求,来获得内核服务的接口。

weixin_62692613的博客 1508

【Linux】I/O操作

I/O操作,缓冲区机制,重定向

2301_81577798的博客 840

嵌入式Linux:文件I/O和标准I/O库

文件 I/O (Input/Output)和标准 I/O 库是用于在 C 语言中进行文件操作的两种不同的方法。

不脱发的程序猿 1191

嵌入式Linux,标准I/O探究,I/O缓冲,以及函数讲解

1.出于速度和效率的考虑,系统I/O调用(即文件I/Oopenreadwrite等)和标准C语言库I/O函数(即标准 I/O函数)在操作磁盘文件时会对数据进行缓冲。1.read()和write()系统调用在进行文件读写操作的时候并不会直接访问磁盘设备,而是仅仅在用户空间缓 冲区和内核缓冲区(kernel buffer cache)之间复制数据。比如。

YYYYYYJJJJJYYYYY的博客 1298

Linux C\C++方式下的文件I/O编程

在旧头文件里的fstream.h,如果使用ifstreamfile的默认参数声明一个输入文件流,当这个要读的file文件不存在时,会自动创建一个空文件,从而给判断文件是否存在造成了很多麻烦。因为C++兼容C,所以C中的输入输出函数依然可以在C++中使用,但是很显然,直接把C的那套输入输出搬到C++中肯定无法满足C++的需求,更重要的一点是,C中的输入输出有类型要求,只支持基本类型,因此C++设计了易于使用的并且多种输入输出流接口统一的I/O类库,并且支持多种格式化操作,还可以自定义格式化操作。

夏天又到了的专栏 3182

Linux——基础I/O

Liunx---基础I/O

m0_69323023的博客 1911

Linux -文件I/O操作

文件不存在则创建新文件)、“a”(追加,写入的数据会被追加到文件尾,如果文件不存在则创建新文件)、“r+”(读写,文件必须存在)、“w+”(读写,同上,但文件内容会被清空)、“a+”(读写,写入的数据会被追加到文件尾)等。flags:用于指定文件如何被打开或创建,例如O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)、O_CREAT(如果文件不存在则创建)、O_TRUNC(如果文件已存在且为只写或读写模式,则长度截断为0)等。它从一个数组中获取数据,并将数据写入到文件中。

2301_79274600的博客 1207
上一篇: 程序员,应该掌握的英语词汇
下一篇: Linux shell菜单编写实例[图文]
压屏哥
博客等级 码龄19年 40粉丝 117原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值