fgets()、gets()、EOF、feof()
1. fgets()与gets()
1.1 char * fgets (char * str, int num, FILE *stream);
//从流stream中读入最多num个字符到字符数组str中,当遇到换行符时、或读到num-1个字符时停止。
//自动加上'\0'空字符结尾
1.2 char * gets ( char * str );
读字符串函数 fgets
函数的功能是从指定的文件中读一个字符串到字符数组中
函数调用的形式为
fgets(字符数组名n文件指针) 其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。
在读入最后一个字符后加上串结束标志'\0'。
例如fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入 字符数组str中。
//从标准输入stdin读取一个字符串,遇到换行或结束时候终止。
//不同于fgets,他没有指定num,所以需要注意字符数组str的大小。
1. 在读出n-1个字符之前如遇到了换行符或EOF则读出结束。
2. fgets函数也有返回值其返回值是字符数组的首地址
说明: fgets和gets之间没有宏定义的关系,彼此各自有自己的实现。蠕虫病毒的实现就是函数gets的“功劳”。gets函数的任务是从流中读入一个字符串。它的调用者会告诉它把读入的字符串放在什么地方。但是,gets()函数并不检查缓冲区大小,如果调用者提供了一个指向堆栈的指针,并且get()函数读入的字符数量超过了超过了缓冲区的空间大小,get()会愉快地将多出来的字符继续写入到堆栈中,这就覆盖了堆栈中原来的内容。
如: main()
char line[512];
//在程序的堆栈上分配512个字符的空间 ...
gets(line); //蠕虫病毒的入口,可以将恶意代码通过多出来的数据写入堆栈
}
1.3 fgetc()
读字符函数fgetc
fgetc函数的功能是从指定的文件中读一个字符 函数调用的形式为 字符变量=fgetc(文件指针)
例如ch=fgetc(fp);
其意义是从打开的文件fp中读取一个字符并送入ch中。
对于fgetc函数的使用有以下几点说明
1) 在fgetc函数调用中读取的文件必须是以读或读写方式打开的。
2) 读取字符的结果也可以不向字符变量赋值
3) 在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc 函数后该位置指针将向后移动一个字节。 因此可连续多次使用fgetc函数,读取多个字符。应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动它不需在程序中定义说明,而是由系统自动设置的。
1.4 写字符函数fputc
fputc函数的功能是从指定的文件中写入一个字符函数调用的形式为
fputc(字符常量或变量文件指量或变量)
例如 fputc('a',fp); 其意putc函数的使用也要说明几点
1) 被写入的文件可以用写、读写、追加方式打开用写或读写方式??写入字符从文件首开始。如需保留原有文件内容希望写入的字??被写入的文件若不存在则创建该文件。
2) 每写入一个字符文件内部位置指针向后移动一个字节。
3) fputc函数有一个返回值如写入成功则返回写入的字符否则返回一个EOF。可用此来判断写符写入一个文件再把该文件内容读出显示在屏幕上。
建议用fgets函数彻底替代gets函数。 另外,绝大多数的这些get函数,都有对应的put版本。
int fputc ( int character, FILE * stream );
int putc ( int character, FILE * stream ); //通过宏定义和fputc实现 int putchar ( int character );
//通过宏定义实现:
#define putchar(c) fputc(c, stdout)
int fputs ( const char * str, FILE * stream );
int puts ( const char * str );
说明:两者之间无宏定义实现关系。puts(const char *str)近似等效于fputs(cosnt char *str, stdout),不同点是前者还输出一个'\n' 最后,
1.5 格式化读写函数fscanf和fprinf fscanf函数
fprintf函数与前面使用的scanf和printf 函数的功能相似都是格式化读写函数。
两者的区别在于 fscanf 函数和fprintf函数的读写对象不是键盘和显示器而是磁盘文件。
这两个函数的调用格式为
fscanf(文件指针格式字符串输入表列)
fprintf(文件指针格式字符串输出表列)
例如 fscanf(fp,"%d%s",&i,s);//从文件写出
fprintf(fp,"%d%c",j,ch); //写入
2.1 EOF
EOF是在stdio.h文件中定义的符号常量,值为-1。如, fputc函数返回一个值:如果输出成功则返回值就是输出的字符;如果输出失败,则返回一个EOF。
fgetc函数读字符时遇到文件结束符,函数返回一个文件结束标记EOF。如果想从一个磁盘文件顺序读入字符并在屏幕上显示,
可以: ch = fgetc(fp);while(ch != EOF)
{
putchar(ch);
ch = fgetc(fp);
}
注意,EOF不是可输出字符,因此不能在屏幕上显示。由于ASCII码不可能出现-1,因此EOF定义为-1是合适的。
当读入的字符值等于-1(即EOF)时,表示读入的已不是正常的字符,而是文件结束符。
但以上只适用于读取文本文件的情况。
现在ANSI C 已经允许用缓冲文件系统处理二进制文件,而读入某一个字节中的二进制数据的值有可能是-1,而这又恰好是EOF的值。这就出现了需要读入有用数据,却处理为“文件结束”。
2.2 feof(fp)
用来测试fp所指向的文件当前状态是否是“文件结束”。
如果想顺序读入一个二进制文件数据,可以:
while(!feof(fp))
{
c = fgetc(fp);
...
}
正确的写法应该是:
char c;
c = fgetc(fp);
while(!feof(fp))
{
printf("%X/n", c);
c = fgetc(fp);
}
原因就是在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。
fgets()、gets()、EOF、feof()相关推荐
- C语言之EOF、feof函数、ferror函数
本文为转载文章,原文:C语言再学习 -- EOF.feof函数.ferror函数 EOF详解 1.定义: EOF是end of file的缩写,表示"文字流"(stream)的结尾 ...
- C语言再学习 -- EOF、feof函数、ferror函数
EOF详解 EOF是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file),也可以是标准输入(stdin) ...
- PHP基础学习第十三篇(了解PHP的作用、PHP的语法、PHP的安装、PHP的开发工具、变量、输出(echo与print)、EOF(heredoc)多行字符串理解、最后总结)
1.PHP是什么? PHP是一种创建动态交互性站点的服务器端脚本语言: 例子: <!DOCTYPE html> <html> <body> <?php ech ...
- Linux应用层开发(文件、多线程,多进程、进程间通信)
文件IO编程 linux下⼀切皆⽂件,我们操作外设(⿏标.键盘.磁盘等外设)就像操作⽂件⼀样.要如何操作⽂件与外设,就必须熟练掌握⽂件IO(input写.output读) 1.多文件编程 ...
- C语言三剑客-C和指针、C专家编程、C陷阱和缺陷
阅读这三本书,记录一下平时没注意的细节点,持续更新- C和指针 数据 1.四种基本类型是 整型.浮点型.指针.聚合类型(数组和结构等) 2.整型字面值缺省情况下是能完整容纳这个值的最短类型 3.字面值 ...
- C语言期末大作业15个(附源码)成绩管理系统、图书馆管理系统、学生打卡系统、超市信息管理系统、学生考勤系统、职工信息管理系统源码、歌曲信息管理系统、超市收款系统等等
C语言期末作业15个(上) 1.C语言学生成绩管理系统 2.C语言图书馆管理系统(复杂版) 3.C语言图书馆管理系统(简洁版) 4.C语言停车管理系统(两个版本) 5.C语言学生考勤系统 6.C语言班 ...
- YOLOv5-Lite 详解教程 | 嚼碎所有原理、训练自己数据集、TensorRT部署落地应有尽有...
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨ChaucerG 来源丨集智书童 YOLOv5 Lite在YOLOv5的基础上进行一系列消融实验 ...
- nginx生产环境常用功能include 、虚拟主机别名、rewrite、nginx status详细解析
一.配置文件优化之include参数 如果我们用nginx搭建虚拟主机,虚拟主机太多,我们不能把所有配置放置在nginx.conf中吧?那样这个配置文件就太大了,看起来很乱,所有这时就产生了 incl ...
- 深浅拷贝、函数、内置函数、文件处理、三元运算、递归
深浅拷贝 import copy copy.copy() #浅拷贝 copy.deepcopy() #深拷贝 num = 110 copynum = num #赋值 一.数字和字符串 对于 数字 和 ...
- 黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数
https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver 黑马程序员C语言基础(第五天)运算符与表达式.程 ...
最新文章
- pycharm执行python程序报错ImportError: DLL load failed: torchvision找不到指定的程序
- 计算机视觉与深度学习 | 激光雷达(Lidar)发展史及其应用
- 程序员奇奇怪怪的网络问题
- 1031 查验身份证 (15分)_21行满分代码
- nyoj 21 三个水杯 BFS
- java选择题多选题系统小程序_单选题与多选题判断得分(自动考试小程序,入门级)...
- xjc java_xjc命令转换成java类乱码
- vue 设置输入法隐藏_iPhone键盘的12种隐藏用法,超好用!可惜没几个人知道!
- linux acl源码,acl框架库下载
- 计算机硬件仿真实验软件,计算机硬件实验虚拟仿真平台的设计
- 手机app抓包https请求信息,解决SSL Pinning验证
- java retry: 详解
- 【深度域适配】二、利用DANN实现MNIST和MNIST-M数据集迁移训练
- 布考斯基样样干_查尔斯·布考斯基经典语录
- java计算机毕业设计springboot+vue学生宿舍管理系统 elementui
- js时间戳转换年月日
- 一文详解AIGC:推动元宇宙发展的加速器
- 实训日记五 完善ui组件代码
- 几种近距离的无线通信技术
- 开放标准驱动工业物联网创新