php文本操作方法集合比较

更新时间:2008年07月02日 22:53:23   作者:

fgets和fputs、fread和fwrite、fscanf和fprintf

字符串读写函数fgets和fputs

一、读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针); 其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入 字符数组str中。

[例10.4]从e10_1.c文件中读入一个含10个字符的字符串。

#include

main()

{

FILE *fp;

char str[11];

if((fp=fopen("e10_1.c","rt"))==NULL)

{

printf("Cannot open file strike any key exit!");

getch();

exit(1);

}

fgets(str,11,fp);

printf("%s",str);

fclose(fp);

}

本例定义了一个字符数组str共11个字节,在以读文本文件方式打开文件e101.c后,从中读出10个字符送入str数组,在数组最后一个单元内将加上'\0',然后在屏幕上显示输出str数组。输出的十个字符正是例10.1程序的前十个字符。

对fgets函数有两点说明:

1. 在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。

2. fgets函数也有返回值,其返回值是字符数组的首地址。

二、写字符串函数fputs

fputs函数的功能是向指定的文件写入一个字符串,其调用形式为: fputs(字符串,文件指针) 其中字符串可以是字符串常量,也可以是字符数组名, 或指针 变量,例如:

fputs(“abcd“,fp);

其意义是把字符串“abcd”写入fp所指的文件之中。[例10.5]在例10.2中建立的文件string中追加一个字符串。

#include

main()

{

FILE *fp;

char ch,st[20];

if((fp=fopen("string","at+"))==NULL)

{

printf("Cannot open file strike any key exit!");

getch();

exit(1);

}

printf("input a string:\n");

scanf("%s",st);

fputs(st,fp);

rewind(fp);

ch=fgetc(fp);

while(ch!=EOF)

{

putchar(ch);

ch=fgetc(fp);

}

printf("\n");

fclose(fp);

}

本例要求在string文件末加写字符串,因此,在程序第6行以追加读写文本文件的方式打开文件string 。 然后输入字符串, 并用fputs函数把该串写入文件string。在程序15行用rewind函数把文件内部位置指针移到文件首。 再进入循环逐个显示当前文件中的全部内容。

数据块读写函数fread和fwrite

C语言还提供了用于整块数据的读写函数。 可用来读写一组数据,如一个数组元素,一个结构变量的值等。读数据块函数调用的一般形式为: fread(buffer,size,count,fp); 写数据块函数调用的一般形式为: fwrite(buffer,size,count,fp); 其中buffer是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。 size 表示数据块的字节数。count 表示要读写的数据块块数。fp 表示文件指针。

例如:

fread(fa,4,5,fp); 其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中。

[例10.6]从键盘输入两个学生数据,写入一个文件中, 再读出这两个学生的数据显示在屏幕上。

#include

struct stu

{

char name[10];

int num;

int age;

char addr[15];

}boya[2],boyb[2],*pp,*qq;

main()

{

FILE *fp;

char ch;

int i;

pp=boya;

qq=boyb;

if((fp=fopen("stu_list","wb+"))==NULL)

{

printf("Cannot open file strike any key exit!");

getch();

exit(1);

}

printf("\ninput data\n");

for(i=0;i<2;i++,pp++)

scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);

pp=boya;

fwrite(pp,sizeof(struct stu),2,fp);

rewind(fp);

fread(qq,sizeof(struct stu),2,fp);

printf("\n\nname\tnumber age addr\n");

for(i=0;i<2;i++,qq++)

printf("%s\t%5d%7d%s\n",qq->name,qq->num,qq->age,qq->addr);

fclose(fp);

}

本例程序定义了一个结构stu,说明了两个结构数组boya和 boyb以及两个结构指针变量pp和qq。pp指向boya,qq指向boyb。程序第16行以读写方式打开二进制文件“stu_list”,输入二个学 生数据之后,写入该文件中, 然后把文件内部位置指针移到文件首,读出两块学生数据后,在屏幕上显示。

格式化读写函数fscanf和fprintf

fscanf函数,fprintf函数与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。 两者的区别在于 fscanf 函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。这两个函数的调用格式为: fscanf(文件指针,格式字符串,输入表列); fprintf(文件指针,格式字符串,输出表列); 例如:

fscanf(fp,"%d%s",&i,s);

fprintf(fp,"%d%c",j,ch);

用fscanf和fprintf函数也可以完成例10.6的问题。修改后的程序如例10.7所示。

[例10.7]

#include

struct stu

{

char name[10];

int num;

int age;

char addr[15];

}boya[2],boyb[2],*pp,*qq;

main()

{

FILE *fp;

char ch;

int i;

pp=boya;

qq=boyb;

if((fp=fopen("stu_list","wb+"))==NULL)

{

printf("Cannot open file strike any key exit!");

getch();

exit(1);

}

printf("\ninput data\n");

for(i=0;i<2;i++,pp++)

scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);

pp=boya;

for(i=0;i<2;i++,pp++)

fprintf(fp,"%s %d %d %s\n",pp->name,pp->num,pp->age,pp->

addr);

rewind(fp);

for(i=0;i<2;i++,qq++)

fscanf(fp,"%s %d %d %s\n",qq->name,&qq->num,&qq->age,qq->addr);

printf("\n\nname\tnumber age addr\n");

qq=boyb;

for(i=0;i<2;i++,qq++)

printf("%s\t%5d %7d %s\n",qq->name,qq->num, qq->age,

qq->addr);

fclose(fp);

}

与例10.6相比,本程序中fscanf和fprintf函数每次只能读写一个结构数组元素,因此采用了循环语句来读写全部数组元素。 还要注意指针变量pp,qq由于循环改变了它们的值,因此在程序的25和32行分别对它们重新赋予了数组的首地址。

文件的随机读写

前面介绍的对文件的读写方式都是顺序读写, 即读写文件只能从头开始,顺序读写各个数据。 但在实际问题中常要求只读写文件中某一指定的部分。 为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。 实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。文件定位移动文件内部位置指针的函数主要有两个, 即 rewind 函数和fseek函数。

rewind函数前面已多次使用过,其调用形式为: rewind(文件指针); 它的功能是把文件内部的位置指针移到文件首。 下面主要介绍

fseek函数。

fseek函数用来移动文件内部位置指针,其调用形式为: fseek(文件指针,位移量,起始点); 其中:“文件指针”指向被移动的文件。 “位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB 时不会出错。当用常量表示位移量时,要求加后缀“L”。“起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。

其表示方法如表10.2。

起始点    表示符号    数字表示

──────────────────────────

文件首    SEEK—SET    0

当前位置   SEEK—CUR    1

文件末尾   SEEK—END     2

例如:

fseek(fp,100L,0);其意义是把位置指针移到离文件首100个字节处。还要说明的是fseek函数一般用于二进制文件。在文本文件中由 于要进行转换,故往往计算的位置会出现错误。文件的随机读写在移动位置指针之后, 即可用前面介绍的任一种读写函数进行读写。由于一般是读写一个数据据块,因此常用fread和fwrite函数。下面用例题来说明文件的随机读写。

[例10.8]在学生文件stu list中读出第二个学生的数据。

#include

struct stu

{

char name[10];

int num;

int age;

char addr[15];

}boy,*qq;

main()

{

FILE *fp;

char ch;

int i=1;

qq=&boy;

if((fp=fopen("stu_list","rb"))==NULL)

{

printf("Cannot open file strike any key exit!");

getch();

exit(1);

}

rewind(fp);

fseek(fp,i*sizeof(struct stu),0);

fread(qq,sizeof(struct stu),1,fp);

printf("\n\nname\tnumber age addr\n");

printf("%s\t%5d %7d %s\n",qq->name,qq->num,qq->age,

qq->addr);

}

文件stu_list已由例10.6的程序建立,本程序用随机读出的方法读出第二个学生的数据。程序中定义boy为stu类型变量,qq为指向boy 的指针。以读二进制文件方式打开文件,程序第22行移动文件位置指针。其中的i值为1,表示从文件头开始,移动一个stu类型的长度, 然后再读出的数据即为第二个学生的数据。

文件检测函数

C语言中常用的文件检测函数有以下几个。

一、文件结束检测函数feof函数调用格式: feof(文件指针);

功能:判断文件是否处于文件结束位置,如文件结束,则返回值为1,否则为0。

二、读写文件出错检测函数ferror函数调用格式: ferror(文件指针);

功能:检查文件在用各种输入输出函数进行读写时是否出错。 如ferror返回值为0表示未出错,否则表示有错。

三、文件出错标志和文件结束标志置0函数clearerr函数调用格式: clearerr(文件指针);

功能:本函数用于清除出错标志和文件结束标志,使它们为0值。

C库文件

C系统提供了丰富的系统文件,称为库文件,C的库文件分为两类,一类是扩展名为".h"的文件,称为头文件, 在前面的包含命令中我们已多次使用过。在".h"文件中包含了常量定义、 类型定义、宏定义、函数原型以及各种编译选择设置等信息。另一类是函数库,包括了各种函数的目标代码,供用户在程序中调用。 通常在程序中调用一个库函数时,要在调用之前包含该函数原型所在的".h" 文件。

在附录中给出了全部库函数。

ALLOC.H    说明内存管理函数(分配、释放等)。

ASSERT.H    定义 assert调试宏。

BIOS.H     说明调用IBM—PC ROM BIOS子程序的各个函数。

CONIO.H    说明调用DOS控制台I/O子程序的各个函数。

CTYPE.H    包含有关字符分类及转换的名类信息(如 isalpha和toascii等)。

DIR.H     包含有关目录和路径的结构、宏定义和函数。

DOS.H     定义和说明MSDOS和8086调用的一些常量和函数。

ERRON.H    定义错误代码的助记符。

FCNTL.H    定义在与open库子程序连接时的符号常量。

FLOAT.H    包含有关浮点运算的一些参数和函数。

GRAPHICS.H   说明有关图形功能的各个函数,图形错误代码的常量定义,正对不同驱动程序的各种颜色值,及函数用到的一些特殊结构。

IO.H      包含低级I/O子程序的结构和说明。

LIMIT.H    包含各环境参数、编译时间限制、数的范围等信息。

MATH.H     说明数学运算函数,还定了 HUGE VAL 宏, 说明了matherr和matherr子程序用到的特殊结构。

MEM.H     说明一些内存操作函数(其中大多数也在STRING.H 中说明)。

PROCESS.H   说明进程管理的各个函数,spawn…和EXEC …函数的结构说明。

SETJMP.H    定义longjmp和setjmp函数用到的jmp buf类型, 说明这两个函数。

SHARE.H    定义文件共享函数的参数。

SIGNAL.H    定义SIG[ZZ(Z] [ZZ)]IGN和SIG[ZZ(Z] [ZZ)]DFL常量,说明rajse和signal两个函数。

STDARG.H    定义读函数参数表的宏。(如vprintf,vscarf函数)。

STDDEF.H    定义一些公共数据类型和宏。

STDIO.H    定义Kernighan和Ritchie在Unix System V 中定义的标准和扩展的类型和宏。还定义标准I/O 预定义流:stdin,stdout和stderr,说明 I/O流子程序。

STDLIB.H    说明一些常用的子程序:转换子程序、搜索/ 排序子程序等。

STRING.H    说明一些串操作和内存操作函数。

SYS\STAT.H   定义在打开和创建文件时用到的一些符号常量。

SYS\TYPES.H  说明ftime函数和timeb结构。

SYS\TIME.H   定义时间的类型time[ZZ(Z] [ZZ)]t。

TIME.H     定义时间转换子程序asctime、localtime和gmtime的结构,ctime、 difftime、 gmtime、 localtime和stime用到的类型,并提供这些函数的原型。

VALUE.H    定义一些重要常量, 包括依赖于机器硬件的和为与Unix System V相兼容而说明的一些常量,包括浮点和双精度值的范围。

相关文章

这篇文章主要介绍了php生成高清缩略图的方法,较为详细的分析了php生成缩略图时出现失真的解决方法,并给出了完整实例进行总结分析,需要的朋友可以参考下2015-12-12

本篇文章是对thinkphp import文件内容变量失效的问题进行了详细的分析介绍,需要的朋友参考下2013-06-06

这篇文章主要介绍了PHP开发实现微信退款功能的方法,涉及php针对微信接口的相关调用操作技巧,需要的朋友可以参考下2017-11-11

PHP的面试题集,附我的答案和分析(一)...2006-11-11

这篇文章主要介绍了采集后数据处理的一点心得笔记,编码转换和正则匹配,基于preg_match_all,需要的朋友可以参考下2014-01-01

本篇文章笔者初学PHP时的一些知识积累经验,需要的朋友参考下2013-06-06

这篇文章主要介绍了php实现四舍五入的方法,实例总结了php实现四舍五入的三种常用方法,具有一定参考借鉴价值,需要的朋友可以参考下2015-03-03

这篇文章主要为大家详细介绍了php实现用户注册密码的crypt加密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-06-06

php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置...2006-11-11

Hash算法我们多少会了解一点了,下面来介绍利用php实现Hash表的一个例子,希望这些例子可以给各位带来帮助,需要的朋友可以参考下2016-11-11

最新评论

php diff 文本比较,php文本操作方法集合比较相关推荐

  1. shell编程基础之基本文本工具集合

    一 shell简介: 1 描述 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用 ...

  2. 一种基于Myers‘diff算法的文本比对工具的实现

    github 实现效果 源码 diff.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ...

  3. AI:大模型领域最新算法SOTA总结、人工智能领域AI工具产品集合分门别类(文本类、图片类、编程类、办公类、视频类、音频类、多模态类)的简介、使用方法(持续更新)之详细攻略

    AI:大模型领域最新算法SOTA总结.人工智能领域AI工具产品集合分门别类(文本类.图片类.编程类.办公类.视频类.音频类.多模态类)的简介.使用方法(持续更新)之详细攻略 导读:由于ChatGPT. ...

  4. 实现文本diff比较与展示

    实现文本diff比较与展示 作为编程人员,文本diff比较与展示应该不陌生,最常见的是在Git中使用git diff命令,可以查看代码修改前后的对比.在git中diff比较与展示的最小单位是行,因为代 ...

  5. java diff 相关_java集合diff算法

    diff算法 比较2个集合对象,得出哪些是新增的.哪些是删除的.哪些是更新的 public class DiffUtil { @Data @Accessors(chain = true) public ...

  6. HDFS中的Diff类——用来描述两个集合的不同

    HDFS中的Diff类--用来描述两个集合的不同 概述 Diff类,用来描述集合状态的变化,e.g. 集合中存在元素{e1, e2, e3},假设集合状态为previous 向集合中添加元素e4,此时 ...

  7. textarea实现datalist效果_手把手撸代码实现Virtual Dom amp;amp; Diff

    前言 文章开篇,我们先思考一个问题,大家都说 virtual dom 这,virtual dom 那的,那么 virtual dom 到底是啥? 首先,我们得明确一点,所谓的 virtual dom, ...

  8. 合格前端系列第五弹- Virtual Dom Diff

    2019独角兽企业重金招聘Python工程师标准>>> 前言 这是一篇很长的文章!!!坚持看到最后有彩蛋哦!!! 文章开篇,我们先思考一个问题,大家都说 virtual dom 这, ...

  9. diff算法_Virtual Dom和Diff算法

    前言 这是一篇很长的文章!!!坚持看到最后有彩蛋哦!!! 文章开篇,我们先思考一个问题,大家都说 virtual dom 这,virtual dom 那的,那么 virtual dom 到底是啥? 首 ...

  10. 【转】git生成diff原理:Myers差分算法

    转载:git生成diff原理:Myers差分算法 | 大艺术家_SN 什么是Myers差分算法 举一个最常见的例子,我们使用git进行提交时,通常会使用git diff --cached来查看这次提交 ...

最新文章

  1. bzoj 1787 紧急集合
  2. 漫画:什么是八皇后问题?
  3. PacBio三代测序
  4. 《第一行代码》学习笔记19-广播接收器Broadcast_Receiver(2)
  5. 小程序二级页面tabbar_小程序页面推广踩坑记
  6. Android蓝牙设备名显示修改
  7. infopath视图切换
  8. RabbitMQ七种队列模式介绍与应用场景(通俗易懂)
  9. springcloud 实现反向代理和负载均衡
  10. vxworks任务通信机制
  11. Apache安装及jboss部署说明文档1
  12. 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - ActiveXForm在线体验安全设置...
  13. SQL Server 2012安装配置(Part3 )
  14. 浅谈php的抽象类和接口类
  15. Java Web之EL表达式和JSTL
  16. 实盘中在vnpy多策略多交易对交易
  17. uniapp下微信小程序超过2MB大小限制的解决方法
  18. linux点击桌面图标无反应,电脑点击图标没反应怎么回事
  19. 诛仙2服务器不显示列表,诛仙2 服务器列表
  20. OCR识别数学公式图片,获得原始公式代码

热门文章

  1. Linux系统环境下安装配置JDK
  2. 在线文件管理系统 下载地址
  3. 19.docker attach
  4. 22. Yii 组件属性
  5. 9. Doctrine2
  6. 27. 安全 HTTP (2)
  7. 74. PHP 计数器
  8. css3中的border-image用法
  9. 用TestComplete实现一个关键字驱动测试框架
  10. [bzoj1510][POI2006]Kra-The Disks_暴力