zoukankan      html  css  js  c++  java
  • getline()函数

      这是一篇关于getline()函数的博客,以总结对输入输出流的掌握,不再在这些问题上栽跟头~

    --------------------------

      1.首先我们知道,getline()函数的基本作用,在C++标准库里面的函数定义为:istream& getline ( istream &is , string &str , char delim );   这里需要解释一下,istream &is是输入流,譬如cin; string &str是将读取到的字符串存储的地方(命名自由);    char delim代表,读入遇到该delim时就终止(可以省略该参数,省略则默认为' ',换行符)。 例如下面代码1:

    1 #include <iostream>
    2 #include <string>
    3 using namespace std;
    4 
    5 int main(){
    6     string data;
    7     getline(cin,data,'$');
    8     cout<<data;
    9 } 
    代码1

    结果如图:

    字符'$'后面的'!'并没有被读入,读入的部分为It's a apple   

         2.另外关于在while循环中遇到getline()函数,那又是怎样的一种体验呢?    

          一般我们会认为while(getline(cin,str))在遇到空白输入时候,就会终止。其实不然,当你在不断的敲Enter键想让其终止时,会发现光标还是在往下走,并没有结束程序的意思。那是因为函数定义,是读入“输入流”:Enter键的换行也是输入流。=_=||.....别担心,这时候键入EOF回车(即window Ctrl+z; Linux Ctrl+d),就可以完成输入了。          为什么会这样呢?因为getline()首先从标准输入设备上读入字符,然后返回给输入流cin(而不是line,line为空即为输入结束),注意是cin,所以while()判断语句的判断对象是cin,也就是判断当前是否存在有效的输入流。  

       3.此外gets()函数,也是一个点,需要掌握,前几天做题的时候小有涉略,这里也给出总结。这是C语言中的一个函数,一篇博客中写道:从流中读取字符串。

          gets()函数用于从缓冲区中读取字符串,原型如下: char *gets(char *string); gets()函数从流中读取字符串,直到出现换行符或文件结尾为止,最后加上NULL作为字符串结束。所读取的字符串暂时存在给定的参数string中。若成功,则返回string的指针,否则返回NULL。(该函数并不能处理string类型, DEV-C++对这一编写情况报错)。

      另外:由于gets()不检查字符串string的大小,只在遇到换行符或者文件结尾的时候才会结束,这样就会出现缓存区溢出的现象,导致程序崩溃。这个时候要换函数fgets().   这个函数,由于该特点所以并不被看好,多数编程者不推荐该函数。但是在DEV-C++中测试的结果并未如此:

    1 #include <stdio.h>
    2 using namespace std;
    3 
    4 int main(){
    5     char data[5];
    6     gets(data); 
    7     printf("%s",data);
    8 } 
    代码2

    结果如下:

       

    这是编译器优化的结果,编译器的优化解决了这个程序的bug。

      4.下面介绍fgets()函数的情况。

           fgets()函数比gets()函数高明的地方是指出了要读入字符串的大小。

         fgets()函数的原型是 char * fgets(char * string, int size, FILE * stream);  string是一个字符数组,用来保存读取到的字符;size用来记录字符串的大小,如果字符个数大于size-1,则最后读取size-1个字符,并在最后一个字符处补'';若字符个数小于等于size-1,则能够正常读取,也就是最多能读取size-1个字符;FILE * stream代表一个文件指针流。

          如果读取成功,则返回读取到的字符串,即string;失败或者读取到文件尾,则返回NULL。因此我们不能直接通过fgets()的返回值来判断函数是否是出错而终止的,应该借助feof()函数或者ferror()函数来判断。(放心,这里就不拓展了,细节自己百度。)    例如下面代码3:

     1 #include <stdio.h>
     2 using namespace std;
     3 
     4 int main(void)
     5  {
     6      FILE *fp = NULL;
     7      char buf[512] = {0};
     8 
     9      fp = fopen("touch.txt","r"); 
    10      if ( NULL == fp) {
    11        printf("open file failed.
    ");
    12        return 0;
    13      }
    14     
    15      int i=7;
    16      while(i--){
    17          fgets(buf, 5, fp);
    18          printf("the 5 char buf = %s
    ", buf);    
    19      }
    20      
    21      return 0;
    22  }
    代码3

    其中touch.txt中存储内容为:sadhajdshaksjdhajkd

    结果如下:

              关于fgets()函数读取文件,size要大于  该行总数+2.(多出来的两个,一个保存文件本身的' '换行,一个保存字符串本身的结束表示'' .)。文件并不会继续读下去,仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行。

  • 相关阅读:
    LeetCode 120:三角形最小路径和
    守护进程
    G711时间戳增量和数据包大小的关系
    H264防止竞争机制
    硬编码帧率错误导致的浏览器不能播放的问题
    GCC inline
    单例模式的双检锁的隐患和优化
    Java中异常捕获子类异常捕获在父类异常前面,即小范围先被捕获
    线程运行流程图
    将二维数组转为稀疏数组
  • 原文地址:https://www.cnblogs.com/liugl7/p/4807034.html
Copyright © 2011-2022 走看看