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()函数的两种用法的更多相关文章

  1. underscore函数存在两种用法

    var _ = require('underscore'); var a = {"a": 1, "b": 2}; console.log(_(a).size() ...

  2. C++ getline()的两种用法

    getline():用于读入一整行的数据.在C++中,有两种getline函数.第一种定义在头文件<istream>中,是istream类的成员函数:第二种定义在头文件<string ...

  3. c++ operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string_cast

    C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式 ...

  4. operator 的两种用法

    C++,有时它的确是个耐玩的东东,就比如operator,它有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换).1.操作符 ...

  5. in有两种用法:

    # in有两种用法: 1. 在for中. 是把每一个元素获取到赋值给前⾯的变量. 2. 不在for中. 判断xxx是否出现在str中. #len() 为内置函数,输出为1,2,3,4....., 长度 ...

  6. [VC]C++ operator 两种用法

    C++中的operator,有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换).下面分别进行介绍:   1.operato ...

  7. JavaScript 函数的两种声明方式

    1.函数声明的方式 JavaScript声明函数有两种选择:函数声明法,表达式定义法. 函数声明法 function sum (num1 ,num2){ return num1+num2 } 表达式定 ...

  8. Service的两种用法及其生命周期

    先来一点基础知识: Service 是android的四大组件之一,与Activity同属于一个级别,它是运行在后台进行服务的组件(例如在后台播放的音乐,播放音乐的同时并不影响其他操作).Servic ...

  9. JSP中的include的两种用法

    1.两种用法 <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 2.用法区别 (1)执行时间上区别 < ...

随机推荐

  1. Jupyterhub Error 503: Proxy Target Missing

    Jupyterhub Error 503: Proxy Target Missing 请求太频繁

  2. group by 和 聚合函数

    1.在oracle中 select * from Table group by id 会报错. 会报不是group by 表达式.为什么一定不能是 * ,而必须是分组的列或者某个列的聚合函数. 在my ...

  3. Storm实时计算:流操作入门编程实践

    转自:http://shiyanjun.cn/archives/977.html Storm实时计算:流操作入门编程实践   Storm是一个分布式是实时计算系统,它设计了一种对流和计算的抽象,概念比 ...

  4. LeetCode 369. Plus One Linked List

    原题链接在这里:https://leetcode.com/problems/plus-one-linked-list/ 题目: Given a non-negative number represen ...

  5. vmem驱动设备

    vmem是内存多字符设备.包含vfs的open.read.write.ioctl.poll.fasync和release函数,device文件的读写. virtual_mem.c #include & ...

  6. nginx 400

    做服务器nginx配置的时候有出现过 400 Bad Request  服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求.

  7. 纯css 更改原生raiod与 checkbox的样式

    原文地址: .checkbox input[type=checkbox], .checkbox-inline input[type=checkbox], .radio input[type=radio ...

  8. 6、Selenium+Python登录案例 -- Github

    一:登录 1.指定浏览器,打开网址:https://github.com/login 2.设置等待时间: time.sleep(3) or driver.implicitly_wait(3) 3.输入 ...

  9. Visualforce入门第二篇_2017.3.1

    代码实现类似Html的表单(Form) <apex:page sidebar="false" standardController="Account"&g ...

  10. 机器学习:PCA(人脸识别中的应用——特征脸)

    一.思维理解 X:原始数据集: Wk:原始数据集 X 的前 K 个主成分: Xk:n 维的原始数据降维到 k 维后的数据集: 将原始数据集降维,就是将数据集中的每一个样本降维:X(i) . WkT = ...