getline() 是 istream 类的成员函数,它有如下两个重载版本:

istream & getline(char* buf, int bufSize);
istream & getline(char* buf, int bufSize, char delim);

第一个版本从输入流中读取 bufSize-1 个字符到缓冲区 buf,或遇到\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;
}

程序的运行过程如下:

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.txtwhile (cin.getline(szBuf, MAX_LINE_LEN + 5))cout << szBuf << endl;return 0;
}

程序每次读入文件中的一行到 szBuf 并输出。szBuf 中不会读入回车符,因此输出 szBuf 后要再输出 endl 以换行。

C++ 读入一行字符串相关推荐

  1. java输入一行_用java编写从标准输入读入一行字符串,打印出其中所有的数字

    用java编写从标准输入读入一行字符串,打印出其中所有的数字 关注:211  答案:1  mip版 解决时间 2021-01-13 10:00 提问者童話被染上了傷 2021-01-12 17:23 ...

  2. C++中的字符串输入输出函数详解

    常见的输入问题: 1.直接用cin输入(当然可以使用cout直接输出): 1)string s; cin >> s; //只接收回车键和空格前面所输入的字符!!!!! 一旦输入空格,cin ...

  3. 10min快速回顾C++语法(五)字符串专题

    C++的语法基础(五) ⭐写在前面的话:本系列文章旨在短时间内回顾C/C++语法中的重点与易错点,巩固算法竞赛与写题过程中常用的语法知识,精准地解决学过但有遗忘的情况,为算法刷题打下坚实的基础. 本文 ...

  4. c++读一行数字以换行结束,读一行句子以换行结束,读多行字符串

    基础 1.getchar() 头文件#include<cstdio>中 从标准输入读下一个字符.原返回int(如输入a,函数返回97). 2.getline() 读入一行字符串,以换行结束 ...

  5. 删除字符串的大写字母c语言,将字符串大写字母变小写 C语言 字符串中大小写字母转换...

    java怎样将大写字母转换成小写字母 具体代码如下,字符串中大.小写互转 1)输入 第一行只有一个整数m(m都说欲擒故纵最能虏获芳心,可小编拿什么对抗她在皱眉时,小编忍不住嘘寒问暖的情绪. jquer ...

  6. 将从键盘上输入的一个字符串的每个单词的第一个字母转换为大写字母

    将从键盘上输入的一个字符串的每个单词的第一个字母转换为大写字母,输入时各单词必须用空格隔开. 输入格式: 用gets()函数 输出格式: "%s" #include <std ...

  7. Java基础(十一) Stream I/O and Files

    Java基础(十一) Stream I/O and Files 1. 流的概念 程序的主要任务是操纵数据.在Java中,把一组有序的数据序列称为流. 依据操作的方向,能够把流分为输入流和输出流两种.程 ...

  8. MFC中CString.format用法

    MFC中CString.Format的详细用法 收藏  在MFC程序中,使用CString来处理字符串是一个很不错的选择. CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的 ...

  9. 《啊哈!算法》笔记_Day02

    这篇先写前三节,下一篇在把这一张剩下的写完 第2章 栈.队列.链表 第一节 解密QQ号--队列 第二节 解密回文--栈 第三节 纸牌游戏--小猫钓鱼 第一节 解密QQ号--队列 这一节通过解密一个QQ ...

最新文章

  1. 粒子物理标准模型错了?电子“表哥”磁性超出理论预计,物理学家找到未知粒子存在证据...
  2. POJ 1459--最大流算法
  3. UFLDL深度学习笔记 (三)无监督特征学习
  4. UVA Mapping the Swaps
  5. OCR的备份与恢复方法
  6. 一张图理解RACSignal的Subscription过程
  7. 2014编程之美初赛第二场
  8. SQL中STR()函数功能
  9. conda安装tensorflow-gpu简洁版_【DP系列教程02】DeePMDkit:conda安装 amp; 离线安装
  10. 一致性hash原理及php实例
  11. 【Python】Django CSRF问题
  12. 遇到不适当的参数_高清兽用B超机参数调整——“增益”
  13. 2019年互联网企业软件测试面试题(常考)
  14. Linux的安装教程 | 菜鸟教程
  15. 比较拼音的相似度,汉字纠错使用
  16. 20190404-亥姆霍兹方程、表面等离极化激元
  17. kali之永恒之蓝使用流程(操作全套步骤)
  18. 一个入行很长的老鸟给新手的一些建议——转
  19. photoshop 2019 mac版 可支持最新M1芯片处理器
  20. ISME:长江流域Comammox Nitrospira的群落、生物地理学和生态驱动者

热门文章

  1. 小甲鱼python课后题简书_Python练习题100道
  2. delphi chart 曲线实时_发展学生曲线跑能力的体育游戏及运用研究
  3. C++17新特性之std::string_view
  4. JavaScript 的 Date 方法的使用
  5. redisTemplate.opsForValue()中方法讲解
  6. @Transactional 实现原理
  7. String、StringBuilder、StringBuffer的区别
  8. IllegalStateException: No WebApplicationContext found: no Co
  9. 关于Redis配置主从复制踩到的坑,主机不显示从机的连接信息
  10. flume linux 命令,Linux环境Flume安装配置及使用