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[3] = { 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[20];
            if (!fin.getline(_from, 20, sep[0]))
                break;
            fin.ignore(1); //忽略一个字符

            char _time[20];
            fin.getline(_time, 20, sep[0]);
            fin.ignore(1); //忽略一个字符

            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(0, pos); //提取左边的部分为第一字段
            line = line.substr(pos + 2); //将第一字段内容去掉

            pos = line.find(sep); //查找第二个分隔符
            _time = line.substr(0, pos); //提取第二字段

            content = line.substr(pos + 2); //剩余的为第三字段
            cout << fromUser << "\t" << _time << "\t" << content << endl;
        }
        fin2.close();
    }
    //ofstream f_del("ol_msg.msg"); //清空文件内容
    //f_del.close();
    return 0;
}
时间: 2024-08-01 04:41:36

getline()函数的两种用法的相关文章

operator 的两种用法

C++,有时它的确是个耐玩的东东,就比如operator,它有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换). 1.操作符重载C++可以通过operator实现重载操作符,格式如下:类型T operator 操作符 (),比如重载+,比如下面这个例子template<typename T> class A{public:     const T operator+(const T& rhs)     {  

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

C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式转换,我们下面就用以下这个小例子温故一下这两种用法: 1 #include <iostream> 2 #include <sstream> 3 using namespace std; 4 5 class FuncObj 6 { 7 public: 8 FuncObj(int n):

java中super 的两种用法

通过用 static 来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于 C 语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自己是否在用面向对象的思想编程,自己的程序是否是面向对象的. 好了,现在开始讨论 this&super 这两个关键字的意义和用法. 在 Java 中, this 通常指当前对象, super 则指父类的.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用

JSP中的include的两种用法

1.两种用法 <@inlcude file ="header.jsp"/> 此时引入的是静态的jsp文件,它将引入的jsp中的源代码原封不动地附加到当前文件中,所以在jsp程序中使用这个指令的时候file里面的值(即要导入的文件)不能带多余的标签或是与当前jsp文件重复的东西.例如里面不要包含<html><body>这样的标签,因为是把源代码原封不动的附加过来,所以会与当前的jsp中的这样的标签重复导致出错. <jsp:include page

Android---24---Spinner的两种用法

Spinner是一个列表选择框,它有两种用法: 一种是使用android:entries属性的,一种是不使用该属性,通过动态的添加Adapter来实现的. 第一种: MainActivity.java: import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import andr

Button的Click事件与js函数的两种不同顺序触发方式

先执行js,或者先执行Click事件,最近就遇到了这个问题,开始弄了两个按钮分别执行,那才叫一个蛋疼... 1.先执行js,再执行Button的Click函数 <asp:Button ID="btn_delete" runat="server" Text="提交" onclick="button1_Click"/> 前台js为 <script language="javascript"&g

jsp中include的两种用法

JSP中的include的两种用法 1.两种用法 <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 2.用法区别 (1)执行时间上区别 <%@ include file=”relativeURI”%>                   是在翻译阶段执行 <jsp:include page=”relativeURI” flush=”true” />  在请求处理阶段执行. (2)引入内容的

JavaScript中的函数的两种定义方式

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /*I总结: 1.函数名可以做变量使用,可以赋值,可以传值 2.函数名当参数,传递给另一个函数 */ //==================js中函

修饰 C++ 成员函数的两种关键字总结

修饰 C++ 成员函数的两种关键字总结 常量成员函数 (const 关键字) const 修饰成员函数表示这个成员函数不能修改类的成员变量,因此这种成员函数称为常量成员函数.这样,编译器可以对这个函数进行深度的优化.另外,一个类的常量型示例只能调用常量型成员函数.比如下面这个例子. class Test { public: Test(); int getValue() const; int value(); private: int intValue; }; Test::Test(): intV