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

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

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

 #include <iostream>
#include <string>
using namespace std; int main(){
string data;
getline(cin,data,'$');
cout<<data;
}

代码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++中测试的结果并未如此:

 #include <stdio.h>
using namespace std; int main(){
char data[];
gets(data);
printf("%s",data);
}

代码2

结果如下:

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

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

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

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

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

 #include <stdio.h>
using namespace std; int main(void)
{
FILE *fp = NULL;
char buf[] = {}; fp = fopen("touch.txt","r");
if ( NULL == fp) {
printf("open file failed.\n");
return ;
} int i=;
while(i--){
fgets(buf, , fp);
printf("the 5 char buf = %s\n", buf);
} return ;
}

代码3

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

结果如下:

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

getline()函数的更多相关文章

  1. getline函数彻底说明

    因为之前每次使用这个函数都要在网上查一遍,觉得很麻烦,这次就认真地整理一下,希望写完之后就记住. getline函数其实有两个: 一个是全局函数,include<cstring>, 原型是 ...

  2. C/C++中的getline函数总结:

    来自:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html C/C++中的getline函数总结 getline函数是一个比较 ...

  3. C++: getline函数

    转自http://blog.sina.com.cn/s/blog_60263c1c0101ck25.html 学习C++的同学可能都会遇到一个getline()函数,譬如在C++premer中,标准s ...

  4. C++学习46 getline()函数读入一行字符 一些与输入有关的istream类成员函数

    getline函数的作用是从输入流中读取一行字符,其用法与带3个参数的get函数类似.即    cin.getline(字符数组(或字符指针), 字符个数n, 终止标志字符) [例13.7] 用get ...

  5. c程序设计语言_习题1-16_自己编写getline()函数,接收整行字符串,并完整输出

    Revise the main routine of the longest-line program so it will correctly print the length of arbitra ...

  6. Linux下的getline函数

    最近在做国嵌的mp3项目,在mp3主控程序中用到了这个函数,挺好使的,在这里记录一下.注意是linux下的,不是C++中的. 函数原型 ssize_t getline(char **lineptr, ...

  7. C++中getline函数的使用

    代码: #include <iostream> #include <cstdio> using namespace std; int main(){ char* s; s = ...

  8. getline函数

    在我的印象中,getline函数常常出如今自己的视野里,模糊地记得它常常常使用来读取字符串 .可是又对它的參数不是非常了解,今天又用到了getline函数,如今来细细地总结一下: 首先要明确设计get ...

  9. getline函数(精华版)

    在我的印象中,getline函数经常出现在自己的视野里,模糊地记得它经常用来读取字符串   .但是又对它的参数不是很了解,今天又用到了getline函数,现在来细细地总结一下:   首先要明白设计ge ...

随机推荐

  1. 【iScroll源码学习01】准备阶段

    前言 我们昨天初步了解了为什么会出现iScroll:[SPA]移动站点APP化研究之上中下页面的iScroll化(上),然后简单的写了一个demo来模拟iScroll,其中了解到了以下知识点: ① v ...

  2. 使用animate()的时候,有时候会出现移进移出的闪动问题

    怎么解决这种问题呢?在animate()前面需要加上stop() 例如: $(".nav_list").hover(function(){ $(".div1") ...

  3. ABAP 数据字典中的参考表和参考字段的作用

         ABAP数据字典中的参考表和参考字段的作用 大家最初在SE11中创建表和结构的时候都会遇到一个问题,如果设定了某个字段为QUAN或者CURR类型,也就是数量或金额的时候,总会要求输入一个参考 ...

  4. 如何排查sharepoint2010用户配置文件同步服务启动问题

    用户配置文件同步服务与 Microsoft Forefront Identity Manager (FIM) 交互,以与外部系统(如目录服务和业务系统)同步配置文件信息.启用用户配置文件同步服务时,将 ...

  5. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q4-Q5)

    Question 4 You are designing a SharePoint 2010 application to store 50 GB of digital assets, includi ...

  6. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q49-Q51)

    Question 49You are designing a SharePoint 2010 intranet site for a corporation. Your design must mee ...

  7. UIView中的坐标转换

    在使用 UITableViewCell 的frame属性获取origin得到的坐标是不变的. 也就是说如果UITableView初始化完毕后,每个cell的坐标是固定的,x不变,y 随index递增的 ...

  8. 论使用LeanCloud中遇到的坑

    1.短信验证码 当注册用户的时候,会发现收不到短信验证码,打印e : That operation isn't allowed for clients. 含义 - 该操作无法从客户端发起.请检查该错误 ...

  9. C语言中的数组的一些笔记

    C语言是面向过程的语言. 计算数组长度: Int count =sizeof(ages)/sizeof(int); C语言里面输出字符串,必须以'\0'结束,如果没有则一直执行下去. Char nam ...

  10. [转]android笔记--Intent和IntentFilter详解

    Intent用于启动Activity, Service, 以及BroadcastReceiver三种组件, 同时还是组件之间通信的重要媒介. 使用Intent启动组件的优势1, Intent为组件的启 ...