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()相关推荐

  1. C语言之EOF、feof函数、ferror函数

    本文为转载文章,原文:C语言再学习 -- EOF.feof函数.ferror函数 EOF详解 1.定义: EOF是end of file的缩写,表示"文字流"(stream)的结尾 ...

  2. C语言再学习 -- EOF、feof函数、ferror函数

    EOF详解 EOF是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file),也可以是标准输入(stdin) ...

  3. PHP基础学习第十三篇(了解PHP的作用、PHP的语法、PHP的安装、PHP的开发工具、变量、输出(echo与print)、EOF(heredoc)多行字符串理解、最后总结)

    1.PHP是什么? PHP是一种创建动态交互性站点的服务器端脚本语言: 例子: <!DOCTYPE html> <html> <body> <?php ech ...

  4. Linux应用层开发(文件、多线程,多进程、进程间通信)

    文件IO编程        linux下⼀切皆⽂件,我们操作外设(⿏标.键盘.磁盘等外设)就像操作⽂件⼀样.要如何操作⽂件与外设,就必须熟练掌握⽂件IO(input写.output读) 1.多文件编程 ...

  5. C语言三剑客-C和指针、C专家编程、C陷阱和缺陷

    阅读这三本书,记录一下平时没注意的细节点,持续更新- C和指针 数据 1.四种基本类型是 整型.浮点型.指针.聚合类型(数组和结构等) 2.整型字面值缺省情况下是能完整容纳这个值的最短类型 3.字面值 ...

  6. C语言期末大作业15个(附源码)成绩管理系统、图书馆管理系统、学生打卡系统、超市信息管理系统、学生考勤系统、职工信息管理系统源码、歌曲信息管理系统、超市收款系统等等

    C语言期末作业15个(上) 1.C语言学生成绩管理系统 2.C语言图书馆管理系统(复杂版) 3.C语言图书馆管理系统(简洁版) 4.C语言停车管理系统(两个版本) 5.C语言学生考勤系统 6.C语言班 ...

  7. YOLOv5-Lite 详解教程 | 嚼碎所有原理、训练自己数据集、TensorRT部署落地应有尽有...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨ChaucerG 来源丨集智书童 YOLOv5 Lite在YOLOv5的基础上进行一系列消融实验 ...

  8. nginx生产环境常用功能include 、虚拟主机别名、rewrite、nginx status详细解析

    一.配置文件优化之include参数 如果我们用nginx搭建虚拟主机,虚拟主机太多,我们不能把所有配置放置在nginx.conf中吧?那样这个配置文件就太大了,看起来很乱,所有这时就产生了 incl ...

  9. 深浅拷贝、函数、内置函数、文件处理、三元运算、递归

    深浅拷贝 import copy copy.copy() #浅拷贝 copy.deepcopy() #深拷贝 num = 110 copynum = num #赋值 一.数字和字符串 对于 数字 和 ...

  10. 黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数

    https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver 黑马程序员C语言基础(第五天)运算符与表达式.程 ...

最新文章

  1. pycharm执行python程序报错ImportError: DLL load failed: torchvision找不到指定的程序
  2. 计算机视觉与深度学习 | 激光雷达(Lidar)发展史及其应用
  3. 程序员奇奇怪怪的网络问题
  4. 1031 查验身份证 (15分)_21行满分代码
  5. nyoj 21 三个水杯 BFS
  6. java选择题多选题系统小程序_单选题与多选题判断得分(自动考试小程序,入门级)...
  7. xjc java_xjc命令转换成java类乱码
  8. vue 设置输入法隐藏_iPhone键盘的12种隐藏用法,超好用!可惜没几个人知道!
  9. linux acl源码,acl框架库下载
  10. 计算机硬件仿真实验软件,计算机硬件实验虚拟仿真平台的设计
  11. 手机app抓包https请求信息,解决SSL Pinning验证
  12. java retry: 详解
  13. 【深度域适配】二、利用DANN实现MNIST和MNIST-M数据集迁移训练
  14. 布考斯基样样干_查尔斯·布考斯基经典语录
  15. java计算机毕业设计springboot+vue学生宿舍管理系统 elementui
  16. js时间戳转换年月日
  17. 一文详解AIGC:推动元宇宙发展的加速器
  18. 实训日记五 完善ui组件代码
  19. 几种近距离的无线通信技术
  20. 开放标准驱动工业物联网创新

热门文章

  1. React Hooks之useEffect
  2. 【SAP-FI】未清项管理
  3. 适配器模式 :Adapter(转自阿良.NET)
  4. 【UE】高级载具插件-02-坦克开火
  5. LevelDB初体验 【转】
  6. 看门狗系统设计与临终遗言
  7. android studio 真机调试连不上手机
  8. SPSS如何进行均值比较和T检验之案例实训?
  9. 尽管对领导力的定义众说纷纭
  10. WPF的资源Resource