getline()函数的两种用法
getline()函数的输入流对象可以是标准输入流对象cin,也可以是一个文件输入流对象fin;
(1)输入流对象的成员函数(有三个参数,一般除非需要自己选定停止符,并不推荐使用):
basic_istream<char>& istream::getline(char *str, streamsize num, char delim = '\n');
这个函数是成员函数,所以必须通过对象调用.streamsize为signed integer type,其中:
str为C 字符数组的首地址,保存最终读取的结果.注意是字符数组
num为最多读取的字符个数
delim可选,表示读取到该字符时自动停止读取,默认为换行符
用getline()读取字符到str中,str在代码中通常体现为一个字符数组,streamsize num是一次读入多少个字符, num - 1个字符已经读入,当碰到一个换行标志(或自定义的字符delim)或一个EOF或任意的读入,delim字符不会被放入buffer中。delim字符可以自已设定,默认为回车符'/n'
(2)全局函数(有两个参数,一般推荐使用)
basic_istream<char>& getline(basic_istream<char>& in, string& str);
in为输入流对象的引用;
str为需要保存读取的数据的目的字符串,注意是string对象的引用
以下示例代码中将分别对上述两种getline()用法作说明
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const char sep[] = { 0x1F, 0x7C }; //分隔符
int main()
{
//下面语句输出一条离线消息到文件
ofstream fout("ol_msg.msg", ios::app);
string fromUser = "userA";
if (fout.is_open()) {
fout << fromUser << sep << __TIME__ << sep << "hello!" << endl;
fout.close();
}
///第一种方式,每次读取一个字段,通过传递读取结束标志来自动找到字段的结束
ifstream fin("ol_msg.msg");
if (fin.is_open()) {
cout << "From:\tOn:\t\tContent: " << endl;
while (!fin.eof()) { //未到文件尾
char _from[];
if (!fin.getline(_from, , sep[]))
break;
fin.ignore(); //忽略一个字符 char _time[];
fin.getline(_time, , sep[]);
fin.ignore(); //忽略一个字符 string content;
getline(fin, content); //读取该行剩余的内容即为消息内容
cout << _from << "\t" << _time << "\t" << content << endl;
}
fin.close();
}
cout << endl;
///第二种方式,每次读取一行,然后再通过查找分隔符来分开各个字段
ifstream fin2("ol_msg.msg");
if (fin2.is_open()) {
string line;
while (getline(fin2, line)) { //成功读取到一行
string _time, content;
string::size_type pos = line.find(sep); //查找分隔符的位置
fromUser = line.substr(, pos); //提取左边的部分为第一字段
line = line.substr(pos + ); //将第一字段内容去掉 pos = line.find(sep); //查找第二个分隔符
_time = line.substr(, pos); //提取第二字段 content = line.substr(pos + ); //剩余的为第三字段
cout << fromUser << "\t" << _time << "\t" << content << endl;
}
fin2.close();
}
//ofstream f_del("ol_msg.msg"); //清空文件内容
//f_del.close();
return ;
}
getline()函数的两种用法的更多相关文章
- underscore函数存在两种用法
var _ = require('underscore'); var a = {"a": 1, "b": 2}; console.log(_(a).size() ...
- C++ getline()的两种用法
getline():用于读入一整行的数据.在C++中,有两种getline函数.第一种定义在头文件<istream>中,是istream类的成员函数:第二种定义在头文件<string ...
- c++ operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string_cast
C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式 ...
- operator 的两种用法
C++,有时它的确是个耐玩的东东,就比如operator,它有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换).1.操作符 ...
- in有两种用法:
# in有两种用法: 1. 在for中. 是把每一个元素获取到赋值给前⾯的变量. 2. 不在for中. 判断xxx是否出现在str中. #len() 为内置函数,输出为1,2,3,4....., 长度 ...
- [VC]C++ operator 两种用法
C++中的operator,有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换).下面分别进行介绍: 1.operato ...
- JavaScript 函数的两种声明方式
1.函数声明的方式 JavaScript声明函数有两种选择:函数声明法,表达式定义法. 函数声明法 function sum (num1 ,num2){ return num1+num2 } 表达式定 ...
- Service的两种用法及其生命周期
先来一点基础知识: Service 是android的四大组件之一,与Activity同属于一个级别,它是运行在后台进行服务的组件(例如在后台播放的音乐,播放音乐的同时并不影响其他操作).Servic ...
- JSP中的include的两种用法
1.两种用法 <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 2.用法区别 (1)执行时间上区别 < ...
随机推荐
- STL的erase函数和lower_bound
前提摘要: [1]一般我们的区间是左闭右开,如下面例子2. [2]erase函数谨慎使用. [3]map也是有序保存的. [erase] 1,删除字符串的首字母: string s="ecu ...
- Spring转账业务_注解配置事物控制
1.beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...
- bzoj 2013: A huge tower 数学
题目: 有\(N(2\leq N\leq 620000)\)块砖,要搭一个\(N\)层的塔,要求:如果砖\(A\)在砖\(B\)上面,那么\(A\)不能比\(B\)的长度\(+D\)要长.问有几种方法 ...
- 【LeetCode】005. Longest Palindromic Substring
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- UGUI技巧
http://www.cnblogs.com/suoluo/p/5427514.html Text中的可以单独指定某些文字的颜色,只需将想要变色的文本放在<color=**></co ...
- Python函数-enumerate()
enumerate(sequence, [start=0]) 作用: 将可循环序列sequence以start开始分别列出序列数据和数据下标,即对一个可遍历的数据对象(如列表.元组或字符串),enum ...
- Windbg内核调试之一: Vista Boot Config设置
Windbg进行内核调试,需要一些基本的技巧和设置,在这个系列文章中,我将使用Windbg过程中所遇到的一些问题和经验记录下来,算是对Kernel调试的一个总结,同时也是学习Windows系统内核的另 ...
- Angular5学习笔记 - 虚拟RestfulApi配置与使用(六)
一.安装json-server功能 #windows cnpm install json-server -g #Mac & Linux sudo npm install json-server ...
- 【转】Inter-eNB S1 切换
本博客介绍Inter-eNB的S1切换的流程 当eNB收到测量报告,或是因为内部负荷分担等原因,触发了切换判决,进行eNB间小区间通过S1口的切换. 源eNB通过S1接口的 HANDOVER REQU ...
- 【转】 Pro Android学习笔记(八六):了解Package(5):使用lib
目录(?)[-] 在项目中使用lib 源代码 了解一些机制 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowin ...