getline()函数是一个相当常见的工具,用于从输入流中获取一行数据。
下面我们将详细说明C++中的getline()函数用法,以及在使用getline()函数作为while循环条件时需要注意的问题:
在C++中,getline函数本质上有两种形式:
第一种形式:作为iostream类的成员函数,需要在头文件中声明。
第二种形式:作为普通函数,也需要在头文件中声明。
第一种形式的getline()函数有两种重载形式:
1. istream& getline(char* s, streamsize n);
2. istream& getline(char* s, streamsize n, char delim);
这两种形式的作用都是从输入流中读取最多n个字符(包括终止字符),然后将它们保存在字符数组s中。即使在读取不满n个字符的情况下,如果遇到指定的delim字符或达到字符数限制,读取操作也会终止,而且delim字符不会被保存在s中。
#include <iostream>
// std::cin ; std::cout ; std::endl
int main()
{
char name[256], wolds[256];
std::cout << "Please input your name: ";
std::cin.getline(name, 256);
std::cout << "Please input your wolds: ";
std::cin.getline(wolds, 256);
std::cout << "The result is: " << name << ", " << wolds << std::endl;
std::cout << std::endl;
return 0;
}
输入:Mr. Ling
You are fantastic!
输出:
Mr. Ling, You are fantastic!
通过字符数限制和指定终止字符进行修改的代码示例:
#include <iostream>
// std::cin ; std::cout ; std::endl
int main(){
char name[6];
std::cout << "Please input your name: ";
std::cin.getline(name, 6, '#');
std::cout << "The result is: " << name << std::ends;
std::cout << std::endl;//学习交流群:558970390
return 0;
}
输入: //streamsize限定,截断输出 wonderful
输出:wonde
输入: //所设置的结束标识符,截断输出 won#derful
输出:won
第二种方法:在C++中的getline函数具有四种不同的载入形式:
istream& getline (istream& 输入流, string& 字符串, char 分隔符);
istream& getline (istream&& 输入流, string& 字符串, char 分隔符);
istream& getline (istream& 输入流, string& 字符串);
istream& getline (istream&& 输入流, string& 字符串);
这些函数的用法与第一种方法类似,但是它们接受一个输入流作为参数,将读取的内容存储在字符串类型的字符串中。
函数参数的解释:
输入流:表示一个输入流,例如cin。
字符串:这是一个字符串类型的引用,用于保存从输入流中读取的文本。
分隔符:这是一个字符类型的变量,用于指定何时终止读取;如果未自定义分隔符,函数将在遇到换行符'\n'时终止读取。
以下是一个示例代码:
#include <iostream>
#include <string>
int main() {
std::string name;
std::cout << "Please input your name: ";
std::getline(std::cin, name);
std::cout << "Welcome to here!" << std::ends << name << std::endl;
std::cout << std::endl;
return 0;
}
在输入数据时,只有在遇到换行符或文件结束时,才会停止接受输入。
文件结束(EOF)是C语言中用于区分有效数据和输入结束的特殊标志。EOF的输入方式取决于操作系统,例如在Windows下是使用Ctrl+Z,在Linux/Unix下是使用Ctrl+D。
需要注意的是,getline()函数并非C库函数,而是C++库函数。它会在以下情况下终止读取并生成当前字符串:
1. 达到文件末尾。
2. 遇到指定的定界符(默认定界符是换行符,所以遇到换行符时会返回)。
3. 输入达到最大限制。
在下面的示例代码中,我们使用getline()函数在while循环中作为条件判断,实现逐行读取并输出:
#include <iostream>
#include <string>
using namespace std;
int main() {
string line;
while (getline(cin, line))
cout << line << endl;
return 0;
}
```
大家可能会发觉,在运行时,通常的输入方式都无法中断循环,有时甚至可能出现难以理解的错误。那么,究竟是什么原因导致了这种情况呢?接下来我们来详细分析一下:
getline()函数的定义如下:istream& getline(istream & is, string & str, char delim);
在这个语句中,while循环的判断条件实际上是关于cin(标准输入流)的状态,也就是判断当前是否存在有效的输入数据流。
值得注意的是,输入流是一个对象,我们在判断时考虑的是这个流返回的状态。因此,在正常情况下,无论你如何输入,都无法跳出这个循环。
有些人可能会错误地认为while循环的判断条件是关于"line"(即字符串line是否为空)的,试图通过输入回车来中断循环,但却发现这并不奏效。
事实上,回车和设置的分隔符都可以用来终止getline()函数的读取操作。然而,while循环的判断条件实际上是在判断getline()函数的输入流是否有效。