c getline函数(getline函数)

本文目录
- getline函数
- c++中使用getline怎么读文件
- C++中,getline函数的详解
- getline函数如何使用后面的参数都代表什么
- 关于C++的getline疑问
- C++ 中getline函数使用问题
- C语言有getline()函数吗并帮用程序来详细说明,最好能让初学者都可明白,谢了!
- c++读入文件时getline函数怎么使用
- get()和getline()
- c++中get函数和getline函数的区别
getline函数
getline是C++标准库函数;但不是C标准库函数,而是POSIX(IEEE Std 1003.1-2008版本及以上)所定义的标准库函数(在POSIX IEEE Std 1003.1-2008标准出来之前,则只是GNU扩展库里的函数)。
getline函数梗概:
成员函数getline()是从输入流中读取一行字符,读到终止符时会将’0’存入结果缓冲区中,作为输入的终止。终止符可以是默认的终止符,也可以是定义的终止符。函数的语法结构是:
getline(《字符数组chs》,《读取字符的个数n》,《终止符》)。
在函数遇到和结束定界符相等的字符时函数结束,同时函数抽出定界符,此种情况下该定界符既不被放回输入流,也不被放入要生成的字符串。所以由此可以理解输入结束后的第一个回车是定界符,被确认后抛弃,而第二个才是程序执行运行时正常需要的。
c++中使用getline怎么读文件
在C++中,getline函数是用来从标准输入流cin中读取整行数据的。即默认情况下,getline读的不是哪个文件,而是命令行中键盘的输入。
要使用getline读文件,首先要做的就是将cin重定向到要读的文件中。可以采用以下代码实现
streambuf *backup;
ifstream fin;
fin.open("data.in"); //打开要读的文件。
backup = cin.rdbuf(); // 备份cin本身的缓冲区。
cin.rdbuf(fin.rdbuf()); // 将cin的缓冲区重定向到文件。
// 执行需要的读操作,包括getline。
cin.rdbuf(backup); // 恢复原始的cin缓冲区。
在执行cin.rdbuf(fun.rdbuf());
后就可以使用getline从文件中读取整行数据了。
getline的调用方式为
getline(char
*
buf,
int
size);
即读取一行数据,存到buf中,如果数据长度超过size指定的长度,那么只读size字节数据。
C++中,getline函数的详解
C++中本质上有两种getline函数,一种在头文件《istream》中,是istream类的成员函数。一种在头文件《string》中,是普通函数。
一、在《istream》中的getline函数有两种重载形式:
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );
作用是从istream中读取至多n个字符保存在s对应的数组中。即使还没读够n个字符,如果遇到换行符’\n’(第一种形式)或delim(第二种形式),则读取终止,’\n’或delim都不会被保存进s对应的数组中。
二、在《string》中的getline函数有四种重载形式:
istream& getline (istream& is, string& str, char delim);istream& getline (istream&& is,
string& str, char delim);istream& getline (istream& is, string& str);
istream& getline (istream&& is, string& str);
用法和上一种类似,不过要读取的istream是作为参数is传进函数的。读取的字符串保存在string类型的str中。
扩展资料:
getline不是C库函数,而是gcc的扩展定义或者C++库函数。它会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束。
1)到文件结束,
2)遇到函数的定界符,
3)输入达到最大限度。
参考资料:getline函数-百度百科
getline函数如何使用后面的参数都代表什么
根据c++标准getline只有两种形式
template《classcharT,classtraits,classAllocator》
basic_istream《charT,traits》&
getline(basic_istream《charT,traits》&is,
basic_string《charT,traits,Allocator》&str,
charTdelim);
template《classcharT,classtraits,classAllocator
basic_istream《charT,traits》&
getline(basic_istream《charT,traits》&is,
basic_string《charT,traits,Allocator》&str);
关于C++的getline疑问
getline后面可以指定2个参数或3个参数,
2个参数时,第2个参数就是读取的位数,
3个参数时,第3个参数是终止符,只要2个参数中有一个满足了,就停止读入,
如楼上方式,将会是读5个字符或者遇到’\n’停止
—————————————————
哎,今天用到getline,仔细研究一番才发现楼主这问题问的这么深刻,来看一下getline的实现吧,共同学习之~~
以下为getline函数的实现,在头文件istream中。
下面具体分析一下,太深奥的分析不了,只简述一下,已经足够用了:
_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str, streamsize _Count)
{// get up to _Count characters into NTCS, discard newline
return (getline(_Str, _Count, _Myios::widen(’\n’)));
}
//注:可以看出,两个参数的getline实际也是调用了以’\n’为结束符的三参数getline函数。
_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str,
streamsize _Count, _Elem _Delim)
{// get up to _Count characters into NTCS, discard _Delim
_DEBUG_POINTER(_Str);
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);//注:这句关键,它关系到下面的if是否执行,也就是是否读输入流,整个函数流程太多了,也没看十分明白,但可以肯定的是,当输入流的状态是正常时,该函数的返回值也是true,反之,则返回false。
if (_Ok && 0 《 _Count)
{// state okay, use facet to extract
int_type _Metadelim = _Traits::to_int_type(_Delim);
_TRY_IO_BEGIN
int_type _Meta = _Myios::rdbuf()-》sgetc();//注:从输入流读一个字符
for (; ; _Meta = _Myios::rdbuf()-》snextc())
if (_Traits::eq_int_type(_Traits::eof(), _Meta))
{// end of file, quit
_State |= ios_base::eofbit;
break;
}//注:遇到文件尾,getline结束
else if (_Meta == _Metadelim)
{// got a delimiter, discard it and quit
++_Chcount;
_Myios::rdbuf()-》sbumpc();//注:这句把结束符读掉了,如果不指定结束符,那就是把’\n’读掉了。
break;
}//注:遇到结束符,getline结束,注意这里的顺序,它是先判断是否遇到结束符,后判断是否读入了指定个数的。
else if (--_Count 《= 0)
{// buffer full, quit
_State |= ios_base::failbit;
break;
}//注:读到了指定个数,执行到这里已经隐含了在指定个数的最后一位仍然不是结束符,因此该部分将输入流状态置为了错误。这直接导致了接下来的getline(或者get/》》等等都是不能正确执行的)
else
{// got a character, add it to string
++_Chcount;
*_Str++ = _Traits::to_char_type(_Meta);
}//注:正常读取一个字符
_CATCH_IO_END
}
*_Str = _Elem();// add terminating null character
//注:前面这句为字符串加入了终止符’\0’
_Myios::setstate(_Chcount == 0 ? _State | ios_base::failbit : _State);//注:如果没有读入任何字符,要保持执行这一次getline之前的输入流状态,否则根据这一次getline执行的情况,设置输入流为相应状态。
return (*this);
}
分析完这些就很容易理解楼主所说的情况了:
(1)输入abcd"回车",getline(s,5)遇到换行符结束,输入流状态仍然正确。
(2)输入abcd"空格""回车",getline(s,5)在第5位遇到了空格,因已读满字符串而结束,输入流状态变为了错误,此后的getline(s2,4)是无法读输入流的。但如果在执行getline(s,5)后加一句cin.clear();将输入流状态重新设置为正常,之后再执行getline(s2,4)你就会发现此时是可以继续从输入流读数据的了。
至于你说换行符被s2接收?那是因为你输出完s之后又endl的现象吧,看结果是换了一行,实际s2里是什么都没有。
楼主有兴趣的话可以单步跟踪调试去看一下getline的执行过程的,还是很有意思的~~
C++ 中getline函数使用问题
getline()函数有两个版本,关于这个三个参数的版本,它的第一个参数是指向字符数组的指针,因为你定义的是:char *s(只说明s是指向字符类型的指针,但没有说明它是指向字符数组的),这样能通过编译,但会运行错误,因为编译器在编译时不知道s是指向字符数组的,它以为是指向一个字符的,就只为 s所指向的内容分配一个字节的内存,这样当运行时,程序存那1000个字符是这样做的:先找到s所指向的内存,也就是之前分配的一个字节,存入第一个字符,然后按这个内存地址的顺序继续往下存余下的字符(因为数组是地址连续的),但这时就可能出现错误,因为除了第一个内存是之前分配了的,其他的内存都是未分配的,但又可能是已经存储了其他数据的,所以会出错。而且是可能出错,因为是可能已经存储了其他数据。
当把程序改成这样:
char s; (中括号里的数字小于1000可能会出错,但不一定出错,原因上面已讲)
或者char* s=new char;
或者char a;char * s=a;
或者char a;
cin.getline(s,1000,’\n’);
至于连用两个getline函数没有问题,只是第二个会覆盖第一个所读取的内容,最终数组中存储的是第二次调用getline函数读取的内容。
C语言有getline()函数吗并帮用程序来详细说明,最好能让初学者都可明白,谢了!
C++有getline()函数.
C 有 fgets(), gets() 函数.
用于读取一行字符直到换行符,包括换行符.
char * fgets ( char * str, int num, FILE * stream );
char * gets ( char * str );
/* gets 例子 */
#include 《stdio.h》
int main()
{
char string ;
printf ("Insert your full address: ");
gets (string);
printf ("Your address is: %s\n",string);
return 0;
}
/* fgets 例子 */
#include 《stdio.h》
int main()
{
FILE * pFile;
char mystring ;
pFile = fopen ("myfile.txt" , "r");
if (pFile == NULL) perror ("Error opening file");
else {
fgets (mystring , 100 , pFile);
puts (mystring);
fclose (pFile);
}
return 0;
}
c++读入文件时getline函数怎么使用
getline常用的就两种用法:
1.getline(input,str);
2.getline(input,str,delim);
input就是从哪里读入,通常是cin
str是你的读入字符串,
delim是分隔符。
例如:
string str;
getline(cin,str,’\n’); //用换行符分割每行
然后判断读入完成也是容易的,
直接用返回值就好了。
例如:
string str;
while(getline(cin,str))
{
cout《《str;
}
get()和getline()
不知道你是学C的还是学C++的……
C和C++中都没有get(),如果你说的是gets()的话:
gets()是C中的函数,括号内的参数是char字符串的首地址
假设输入 “123456回车”,gets函数会在char字符串最后加上\0,\n的确没有读入,但它也不在缓冲区里
不信的话你可以试试char a;gets(a);getchar();printf("ok");
如果你说的是cin.get(),接收了"123456",同时末尾加’\0’,’\n’没有读入仍存在于缓冲区中
getline()是C++中的函数,使用方法getline(cin, str)其中str是string类型
同样输入“123456回车”,因为是string类型,所以结尾没有\0,所以getline()也不会吧\n置为\0,缓冲区内也没有数据
如果你说的是cin.getline()
cin.getline()实际上有三个参数,cin.getline(接受的字符串,接受个数,结束字符) 当第三个参数省略时,系统默认为’\0’ ,而且缓冲区中扔有数据
c++中get函数和getline函数的区别
通过标准输入设备向输入流输入一行字符串有两种方式:get函数和getline函数,两者都是类istream的对象cin的成员函数,下面我们来看看两者的区别。
getline函数
getline()函数读取整行,他使用通过ENTER键输入的换行符来确定输入的末尾,但不保存换行符,相反,在存储字符串时,他用空值字符来替换换行符。要调用该函数,可以使用cin.getline(arrayname,strnum),第一个参数表示用来存储输入行的数组名,第二个参数表示输入的字符数。如果字符数为20,则函数最多读取19个字符,余下的用来存储自动在结尾处添加的空值字符。
getline函数在读取指定数目的字符或遇到换行符时停止读取。
get函数
get函数有几种变体,其中一种和getline很像,接收参数相同,解释参数的方式也相同,并且都读取到行尾,但get并不读取并丢弃换行符,而是将其留在输入队列中。
假设两次调用get():
cin.get(name1,size1);
cin.get(name2,size2);
由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符,因此第二个get函数认为已到达行尾,而没有发现任何可读取的内容,即数组name2值为空。
解决方法是借助get(),无参数的函数。其功能是读取下一个字符。
cin.get(name1,size1);
cin.get();
cin.get(name2,size2);
4
注:cin.get(name,size)函数仍返回一个cin对象,因此上述代码可以写为
cin.get(name1,size1).get();

更多文章:
illustrator举例说明(illustrator选择工具和直接选择工具有什么不同啊)
2026年4月3日 07:30
结构体类型名称是什么(什么是结构体类型C语言中结构体类型占几个字节)
2026年1月27日 07:15
css高度自适应(CSS3如何固定图片宽度使图片高度按图片比例自适应)
2025年9月3日 02:45
mapreduce的实现原理(Hadoop技术内幕的内容介绍)
2025年11月16日 03:30
culture shock阅读理解(你好,完形填空I understand culture shock, i’ve been答案你有了吗)
2025年10月15日 21:45
private owner(求一篇 关于国外二手车交易现状的英文文章)
2025年6月10日 08:15
bool类型几个字节(C++定义bool类型的最小存储空间是多大)
2025年7月5日 02:15
手机号码的正则表达式(求国际手机号码完整正则表达式,哪位大侠有)
2026年6月1日 11:30
illustrator怎么记住(illustrator中释放到图层和粘贴时记住图层是什么意思)
2026年1月16日 13:15














