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) 。
  • 相关阅读:
    sfs2x 连接 mongodb
    java websocket
    webstorm 4.0 注册码
    解决 sfs2 admin tool 找不到扩展
    window 注册表五大类
    opengl 学习第二日
    java google Protobuf
    扩展 java sencha touch PhonegapPlugin
    sencha touch2 kryonet socket phonegap 通信 作者:围城
    sencha touch2 layout 笔记
  • 原文地址:https://www.cnblogs.com/zendu/p/4987955.html
Copyright © 2011-2022 走看看