加入收藏 | 设为首页 | 会员中心 | 我要投稿 航空爱好网 (https://www.52kongjun.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

cin.getline C++读入一行字符串 整行数据

发布时间:2022-07-05 10:16:29 所属栏目:语言 来源:互联网
导读:getline() 是 istream 类的成员函数,它有如下两个重载版本: istream getline(char* buf, int bufSize); istream getline(char* buf, int bufSize, char delim); 第一个版本从输入流中读取 bufSize-1 个字符到缓冲区 buf,或遇到n为止(哪个条件先满足就按
  getline() 是 istream 类的成员函数,它有如下两个重载版本:
  istream & getline(char* buf, int bufSize);
  istream & getline(char* buf, int bufSize, char delim);
 
  第一个版本从输入流中读取 bufSize-1 个字符到缓冲区 buf,或遇到 为止(哪个条件先满足就按哪个执行)。函数会自动在 buf 中读入数据的结尾添加�。
 
  第二个版本和第一个版本的区别在于,第一个版本是读到 为止,第二个版本是读到 delim 字符为止。 或 delim 都不会被读入 buf,但会被从输入流中取走。
 
  这两个函数的返回值就是函数所作用的对象的引用。如果输入流中 或 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 以换行。

(编辑:航空爱好网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!