zoukankan      html  css  js  c++  java
  • fscanf和fgets用法

    首先要对fscanf和fgets这两个文件函数的概念有深入的了解,对于字符串输入而言这两个函数有一个典型的区别是:
              fscanf读到空格或者回车时会把空格或回车转化为/0(字符串结束符)而fgets函数则把空格(回车在下文解释)作为字符接收。
              有这样一个例子:
    char str[13];
    scanf("%s",str);
              如果输入以下12个字符How are you?回车
              实际上并不是把这12个字符加上/0送到数组str中,而只将空格前的“How”送到str中,由于把“How”作为一个字符串处理,因此在其后加/0。
              现在我们来看一看在题目的第一个循环中,用gets函数接受字符串的情况。
              1、输入“ABC回车DEF”。
              现在我们来说以下fgets函数对于回车的处理方法。
              fgets函数的定义是这样的:
              char *fgets(char *s,int n,FILE *fp)
              当fgets读到回车符时,函数会结束,把回车符也作为一个字送入参数s指向的缓冲区(注意是缓冲区而不是内存),fgets()函数在读取结束后,再向缓冲区送一个/0字符,从而使缓冲区的字符成为C字符串。
              也就是说fgets函数读到回车的时候,不象fscanf函数那样在内存中把回车转换/0,而是在缓冲区里面处理的。这样处理的结果是回车不起作用,也就是说当我们输入ABC回车DEF时,ABCDEF在内存中是连续存放的。所以在第二个循环输出时自然不会换行。
              2、输入“I AM A STUDENT”,在字符中间加空格。
              在第一次循环中,用fgets读入的结果是“I AM A STUDENT”,空格作为字符处理。那么在第二次循环中,用fscanf读入 “I AM A STUDENT”后将字符串中的空格转换为了/0,也就上将一个字符串分成了四个"I" "AM" "A" "STUDENT"。在这里可能有人要问,那么既然加了/0,为什么循环在读到/0还能继续呢?要注意的是循环的结束条件是EOF(文件结束)而不是/0(文件结束符)。
              第一次输出"I" 遇到/0输出回车结束,继续判断循环条件发现文件并没有结束,那么继续输出"AM"和回车.......一直到"STUDENT"回车。
              补充一个问题,如果想让"I" "AM" "A" "STUDENT"输出在同一行上程序应该怎么改?
              答案就是:fscanf换成fgets(fp, str) 。
  • 相关阅读:
    MCMC等采样算法
    【模拟退火】旅行商问题
    团队项目博客汇总
    2018年春季学期-助教总结
    linux简单命令常用随记
    记一次计算机网络作业
    [东北师大软工]Week2-作业2:个人项目实战 初步测试结果
    为什么你学过Java却忘光了——记第一次助教同学见面会
    ahk打印成pdf记录
    PSP总结报告
  • 原文地址:https://www.cnblogs.com/zendu/p/4987955.html
Copyright © 2011-2022 走看看