这是一篇关于getline()函数的博客,以总结对输入输出流的掌握,再也不在这些问题上栽跟头~ios
--------------------------编程
1.首先咱们知道,getline()函数的基本做用,在C++标准库里面的函数定义为:istream& getline ( istream &is , string &str , char delim ); 这里须要解释一下,istream &is是输入流,譬如cin; string &str是将读取到的字符串存储的地方(命名自由); char delim表明,读入遇到该delim时就终止(能够省略该参数,省略则默认为'\n',换行符)。 例以下面代码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 }
结果如图:缓存
字符'$'后面的'!'并无被读入,读入的部分为It's a apple app
2.另外关于在while循环中遇到getline()函数,那又是怎样的一种体验呢? ide
通常咱们会认为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++中测试的结果并未如此:spa
1 #include <stdio.h> 2 using namespace std; 3 4 int main(){ 5 char data[5]; 6 gets(data); 7 printf("%s",data); 8 }
结果以下:
这是编译器优化的结果,编译器的优化解决了这个程序的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:
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.\n"); 12 return 0; 13 } 14 15 int i=7; 16 while(i--){ 17 fgets(buf, 5, fp); 18 printf("the 5 char buf = %s\n", buf); 19 } 20 21 return 0; 22 }
其中touch.txt中存储内容为:sadhajdshaksjdhajkd
结果以下:
关于fgets()函数读取文件,size要大于 该行总数+2.(多出来的两个,一个保存文件自己的'\n'换行,一个保存字符串自己的结束表示'\0' .)。文件并不会继续读下去,仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行。