cin.getline():C++读入一行字符串(整行数据)
getline() 是 istream 类的成员函数,它有如下两个重载版本:
第二个版本和第一个版本的区别在于,第一个版本是读到
这两个函数的返回值就是函数所作用的对象的引用。如果输入流中
从输入流中读入一行,可以用第一个版本。用
第一个版本的 getline 函数的用法示例如下:
ab cd↙
ab cd
33↙
33
44↙
44
在上面的输入情况下,程序是正常的。程序运行过程中还可能出现如下情况:
ab cd123456k↙
error
ab cd
120
123456
第 7 行,读入时因字符串超长导致出错,于是第 11 行并没有从输入流读入 n,n 维持了原来的值 120。
第 12 行,调用 istream 的成员函数 clear() 清除 cin 内部的错误标记,此后 cin 又能正常读入了。因此,123456 在第 13 行被读入 n。
可以用 getline() 函数的返回值(为 false 则输入结束)来判断输入是否结束。例如,要将文件 test.txt 中的全部内容(假设文件中一行最长有 10 000个字符)原样显示,程序可以如下编写:
istream & getline(char* buf, int bufSize);
istream & getline(char* buf, int bufSize, char delim);
\n
为止(哪个条件先满足就按哪个执行)。函数会自动在 buf 中读入数据的结尾添加\0
。第二个版本和第一个版本的区别在于,第一个版本是读到
\n
为止,第二个版本是读到 delim 字符为止。\n
或 delim 都不会被读入 buf,但会被从输入流中取走。这两个函数的返回值就是函数所作用的对象的引用。如果输入流中
\n
或 delim 之前的字符个数达到或超过 bufSize,就会导致读入出错,其结果是:虽然本次读入已经完成,但是之后的读入都会失败。从输入流中读入一行,可以用第一个版本。用
cin >> str
这种写法是不行的,因为此种读法在碰到行中的空格或制表符时就会停止,因此就不能保证 str 中读入的是整行。第一个版本的 getline 函数的用法示例如下:
#include <iostream> using namespace std; int main() { char szBuf[20]; int n = 120; if(!cin.getline(szBuf,6)) //如果输入流中一行字符超过5个,就会出错 cout << "error" << endl; cout << szBuf << endl; cin >> n; cout << n << endl; cin.clear(); //clear能够清除cin内部的错误标记,使之恢复正常 cin >> n; cout << n << endl; return 0; }程序的运行过程如下:
ab cd↙
ab cd
33↙
33
44↙
44
在上面的输入情况下,程序是正常的。程序运行过程中还可能出现如下情况:
ab cd123456k↙
error
ab cd
120
123456
第 7 行,读入时因字符串超长导致出错,于是第 11 行并没有从输入流读入 n,n 维持了原来的值 120。
第 12 行,调用 istream 的成员函数 clear() 清除 cin 内部的错误标记,此后 cin 又能正常读入了。因此,123456 在第 13 行被读入 n。
可以用 getline() 函数的返回值(为 false 则输入结束)来判断输入是否结束。例如,要将文件 test.txt 中的全部内容(假设文件中一行最长有 10 000个字符)原样显示,程序可以如下编写:
#include <iostream> using namespace std; const int MAX_LINE_LEN = 10000; //假设文件中一行最长 10000 个字符 int main() { char szBuf[MAX_LINE_LEN + 10]; freopen("test.txt", "r", stdin); //将标准输入重定向为 test.txt while (cin.getline(szBuf, MAX_LINE_LEN + 5)) cout << szBuf << endl; return 0; }程序每次读入文件中的一行到 szBuf 并输出。szBuf 中不会读入回车符,因此输出 szBuf 后要再输出 endl 以换行。
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频