一个文件操作的简单程序:关于文件的fopen、fread、fseek、ftell、fclose等操作(FIFO related)_centos7 fclose fseek_Jim's Blog的博客-程序员秘密

技术标签: Linux  

文件的读写能大大提高linux程序编写的效率,减少代码量的同时,可以简化程序逻辑,在设计API交互时应用普遍。下面,我们将通过笔者编写的一个程序来对这个过程做一个初步的讲解,同时也希望通过对改程序的学习,能加强大家对文件的一些基本操作的认识。

linux系统下,文件是基本组成单元,而文件指针则是最常见的操作单位,常常通过文件描述符(FD:file description)来对文件进行操作。文件操作所需要的源文件为“#include<stdio.h>”,关于文件操作函数的定义可以参考以下链接,更加细致:

链接1:文件操作函数

链接2: 函数库查询入口

本文所讲解函数的下载链接:FIFO_write

通过fopen操作将返回该文件的操作符即FD,该函数定义如下:

定义函数: FILE * fopen(const char * path,const char * mode);

函数说明: 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态,如读、写等。

返回值:文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。

fclose则与fopen对应,文件操作后一定记得加上fclose,该函数定义如下:

定义函数: int fclose(FILE * stream);

函数说明: fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。

返回值: 若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno。

此外,文件打开后,文件操作指针将指向开始处,此时可以使用fseek和ftell来对文件内的某个位置做基本操作,例如通过fread和fwrite读写文件内容,或通过ftell统计某一段的字节数。关于fseek和ftell函数定义如下:

定义函数 int fseek(FILE * stream,long offset,int whence);  详细链接:fseek用法

函数说明 fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数whence来移动读写位置的位移数。

返回值 当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码。

定义函数 long ftell(FILE * stream);   详细链接:ftell用法一例(本链接是一个例子)

函数说明 ftell()用来取得文件流目前的读写位置。参数stream为已打开的文件指针。

返回值 当调用成功时则返回目前的读写位置,若有错误则返回-1,errno会存放错误代码。

此外,可以通过fread和fwrite向文件中读写内容,本例用到的是fread,其定义为:

定义函数 size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);详细链接:fwrite与fread的用法

函数说明 fwrite()用来将数据写入文件流中。参数stream为已打开的文件指针,参数ptr 指向欲写入的数据地址,总共写入的字符数以参数size*nmemb来决定。Fwrite()会返回实际写入的nmemb数目。

返回值 返回实际写入的nmemb数目。

定义函数 size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);

函数说明 fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。Fread()会返回实际读取到的nmemb数目,如果此值比参数nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。

返回值 返回实际读取到的nmemb数目。

下面为例程讲解部分:(讲解通过注释的方式进行)

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
uint32_t OpBuf[1024 * 4];
FILE *tFp = NULL;

int main(int argc, char **argv)
{
	//there should be 2 arguments and then open the file in read mode
	if(argc != 2){
		fprintf(stderr,"usage:%s srcfile\n",argv[0]);
		exit(EXIT_FAILURE);
	}
	tFp = fopen(argv[1], "r+");
	//return the fd.
	if (tFp == NULL)
	{
		printf("Error: open error\n");			
		exit(EXIT_FAILURE);	
	}
	//count the bytes of file (usage of fseek and ftell) one char one byte including '\n' maybe also '\r'
	fseek(tFp,0L,SEEK_END);
	printf("file bytes counts %ld\n",ftell(tFp));
	//place the file pointer to the start place and be ready to read the bytes to buffer
	fseek(tFp,0,SEEK_SET);
	int count = 0;
	char buf[10];
	int upperLen = 2;//the total lines
	int read_count=0;
	while (!feof(tFp) && count < upperLen)
	{
		memset(buf, 0, 10);//clear the buffer
		read_count = fread(&buf, 9, 1, tFp);//read 10 bytes 1 time from fd into buffer
		if(read_count){//if bytes read, transfer the bytes to hex and save in OpBuf, and print the bytes 
			OpBuf[count] = strtoul(buf, NULL, 16);//two previous char one byte 
			printf("read %d bytes, 0x%08x(%d)\n", read_count,OpBuf[count],count);
		}
		count++;
		sleep(1);
	}
	fclose(tFp);//close the file
	//send the bytes to FIFO
	int fd ;
	fd = open("/tmp/FIFO-OUT",O_WRONLY|O_NONBLOCK);//open FIFO in read-only and non-block
	if(fd == -1){
		perror("open error");
		exit(EXIT_FAILURE);
	}
	//char buf[1024*4];
	int n = 0;
	n = write(fd,(uint8_t *)OpBuf,upperLen*4);//write the bytes into fifo by byte and the last param is total bytes
	if (n == -1 )
		printf("Null\n");
	else printf("write %d bytes\n",n);
	close(fd);//close fifo
	printf("write success\n");
	return 0;
}
看完这个例程希望大家能有所收获!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/CHANGQINGTENGCJM/article/details/48346069

智能推荐

如何解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题_六月June的博客-程序员秘密

最近做一个项目,需要导出csv表格,我电脑上安装的是wps,自动校正编码了,但是测试人员的电脑上用的是用Excel,总是显示乱码。想了好久好久,终于wps和excel的区别。 处理方法:在你要输出的内容前先输出”\xEF\xBB\xBF”, 例如:你要输出的内容保存在content里content里 content = "\xEF\xBB\xBF".content;//添加BOM确保输出co

pycharm mysql安装_PyCharm安装连接MySQL_贾小乖乖乖的博客-程序员秘密

1、首先安装以下库Pip install pymysqlPip install MySQL-python2、下载安装MySQL Workbench下载选项3、打开PyCharm,添加外部工具View&gt; Tools Windows&gt; Database4、点击出现的对话框的+号选择Data Source&gt;MySQL5、点击最下面的Download在URL中最后加上 ?server...

计算机两个硬盘的作用,固态硬盘时代谈谈双硬盘(固态+机械硬盘)的好处_有书的博客-程序员秘密

即使是不懂笔记本的朋友,恐怕也知道选购笔记本一定要选有固态硬盘(SSD)的机型。从目前笔记本市场的情况来看,几乎所有笔记本都搭载固态硬盘。可能一些小白朋友也发现了,有些笔记本在宣传的时候提到双硬盘,那么双硬盘到底啥意思,相比单硬盘有什么优势呢?双硬盘概念双硬盘并没有确切的定义,这种说法是从笔记本用户中传开的,与台式机用户口中的双硬盘有一些区别。笔记本中的双硬盘一般是指笔记本中同时包含1个固态硬盘和...

使用VirtualBox虚拟机安装Ubuntu系统和常用系统设置教程(含国内多个镜像源下载地址)_virtualbox国内镜像下载_林新发的博客-程序员秘密

Ubuntu镜像下载Ubuntu镜像下载:Ubuntu系统镜像:http://mirrors.melbourne.co.uk/ubuntu-releases/网易开源镜像:http://mirrors.163.com/ubuntu-releases/Ubuntu官方:http://releases.ubuntu.com/Ubuntu中国官网:https://ubuntu.com/download/alternative-downloads中科开源镜像:http://mirrors.ustc.e

二叉树遍历代码c语言_C\Java\Python编程资源分享的博客-程序员秘密

【实例截图】【核心代码】def CreateBiTree(): # 按先序序列输入二叉树结点值,建立一棵二叉树 ch = input('请输入二叉树的字符:') if ch == '^': T = None # 递归调用终止的条件 else: T = BinaryTree(ch) T.lchild = CreateBiTree() # 创建左子树 T.rchild = C

在android下获取有线和无线IP地址的方法,经测试可用_godfly000的博客-程序员秘密

此方法来源于网络,简单修改后,测试通过,返回地址格式为“192.168.1.109”public String getlocalIp() throws SocketException{String ipaddress = null;for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreE

随便推点

18-19年下学期第一次作业_尚兴龙。的博客-程序员秘密

/第九页/&amp;lt;!doctype html&amp;gt;登录​​点我传数据&amp;lt;input type=&quot;hidden&quot;name=&quot;mode1&quot;value=&quot;user&quot;/&amp;gt;&amp;lt;input type=&quot;hidden&quot;name=&quot;fun&quot;value=&quot;login&quot;/&amp;gt;​用户名: &amp;lt;input

子网掩码与子网数目之间的换算_子网换算原理_ayoung_go的博客-程序员秘密

A类网络缺省子网掩码:255.0.0.0 B类网络缺省子网掩码:255.255.0.0 C类网络缺省子网掩码:255.255.255.0例1:给了A类子网掩码255.255.192.0则二进制:11111111 **11111111 11**000000 00000000 前八位为地址掩码,后二十四位表示主机地址 即把网络划分成2的10次方个子网1024个子网。(主

用HBuilderX 打包 vue 项目 为 本地App 的全步骤, 亲测有效_hbuilderx打包vue项目_qq_41737172的博客-程序员秘密

首先打包你的 vue 项目 生成 dist 文件夹,教程请移步 https://www.cnblogs.com/taohuaya/p/10256670.html看完上面的教程,请确保 你是 将:项目目录下的config文件夹里的index.js文件中,将build对象下的assetsPublicPath中的“/”,改为“./”后,打包生成的 dist 文件。开始使用 HBuiderX 打包。(工具下载地址:http://www.dcloud.io/)这是我vue 项目打包后的dist 文件。

Windows 动态磁盘卷:简单卷、跨区卷 、带区卷 、镜像卷 、RAID5卷 相关配置操作_跨区卷坏了一块怎么办_薛定谔的DBA的博客-程序员秘密

Windows Server 2003 提供了新的磁盘管理方式,能够提高磁盘性能和容错能力。将基本磁盘升级为动态磁盘,能够更灵活分配和管理磁盘空间,能够配置各种磁盘阵列提高磁盘能力。动态磁盘与基本磁盘对比:一块基本磁盘只能包含4个分区,它们是最多三个主分区和一个扩展分区,扩展分区可以包含数个逻辑盘。而动态磁盘没有卷数量的限制,只要磁盘空间允许,可以在动态磁盘中任意建立卷。 

送给大家一套完整Web前端开发初学者学习路线_IT-博通哥的博客-程序员秘密

Web前端开发学什么?对于刚刚准备想进入web前端的同学来说,可能只知道web前端开发前景好,薪资高,但是很多人都不知道要从事web前端要学会哪些技术,如今,移动开发的发展依旧如火如荼,企业对于Web前端人才需求产生了巨大的缺口,从事Web前端开发的程序员们则是其中较大的获益者。Web前端的广泛运用,造就了本身的优势。现在学习Web前端是绝佳时期,抓住机会,拿高薪进名企就不再是问题。那么想学好这门技术,需要学习哪些内容呢?学习内容包括7大学习阶段:第1阶段:前端页面重构(4周)内容包含.

毕业论文答辩PPT攻略_weixin_30480583的博客-程序员秘密

今天偶然在一个哥们空间里看到“毕业论文答辩PPT攻略”,看后收获颇深,特转载与君共享(感谢这位大牛~~~)关于内容:1、一般概括性内容:课题标题、答辩人、课题执行时间、课题指导教师、课题的归属、致谢等。2、课题研究内容:研究目的、方案设计(流程图)、运行过程、研究结果、创新性、应用价值、有关课题延续的新看法等。3、PPT要图文并茂,突出重点,让答辩老师明白哪些是自己独立完成的,页数不要太多,...