zoukankan      html  css  js  c++  java
  • C++ getline函数用法

    getline()函数是一个比较常见的函数。根据名字直接望文生义,就知道这个函数是来完成读入一行数据。

    下面就对C++ -- getline()函数的用法说明,以及getline()函数作为while条件的问题,总结一下:

    在C++中本质上有两种getline函数:

    第一种:在头文件<istream>中,是iostream类的成员函数。

    第二种:在头文件<string>中,是普通函数。

    ///////////////////////////////////////////////////////////////////////////////////////////

    第一种: 在<istream>中的getline()函数有两种重载形式:

    istream& getline (char* s, streamsize n );
    istream& getline (char* s, streamsize n, char delim );

    作用是: 从istream中读取至多n个字符(包含结束标记符)保存在s对应的数组中。即使还没读够n个字符,

    如果遇到delim 或 字数达到限制,则读取终止,delim都不会被保存进s对应的数组中。

    *例程代码:

    #include "stdafx.h"

    #include <iostream>

    //使用标准输入流和标准输出流。

    // std::cin ;  std::cout ;  std::endl

    int main()

    {

    char name[256], wolds[256];

    std::cout << "Please input your name: ";

    std::cin.getline(name, 256);

    std::cout << "Please input your wolds: ";

    std::cin.getline(wolds, 256);

    std::cout << "The result is:   " << name << ", " << wolds << std::endl;

    std::cout << std::endl;

    return 0;

    }

    //**输入:

    Mr. Ling

    You are wonderful !

    //输出:

    Mr. Ling, You are wonderful !

    *通过字数限制和设置终止符修改的代码:

    int main()

    {

    char name[6];

    std::cout << "Please input your name: ";

    std::cin.getline(name, 6, '#');

    std::cout << "The result is:   " << name << std::ends;

    std::cout << std::endl;

    return 0;

    }

    //**输入: //streamsize限定,截断输出

    wonderful

    //输出:

    wonder

    //**输入: //所设置的结束标识符,截断输出

    won#derful

    //输出:

    won

    第二种: 在<string>中的getline函数有四种重载形式:

    istream& getline (istream&  is, string& str, char delim);
    istream& getline (istream&& is, string& str, char delim);
    istream& getline (istream&  is, string& str);

    istream& getline (istream&& is, string& str);
    用法和上第一种类似,但是读取的istream是作为参数is传进函数的。读取的字符串保存在string类型的str中。

    函数的变量:

    is    :表示一个输入流,例如 cin。

    str   :string类型的引用,用来存储输入流中的流信息。

    delim :char类型的变量,所设置的截断字符;在不自定义设置的情况下,遇到’ ’,则终止输入。

    *例程代码:

    #include "stdafx.h"

    #include <iostream>

    #include <string>

    int main()

    {

    std::string name;

    std::cout << "Please input your name: ";

    std::getline(std::cin, name);

    std::cout << "Welcome to here!" << std::ends << name << std::endl;

    std::cout << std::endl;

    return 0;

    }

    在输入时,直至遇到‘ ’或EOF, 才终止输入操作。

    //**输入:

    wonderful

    //输出:

    wonderful

    *例程代码:

    nt main()

    {

    std::string name;

    std::cout << "Please input your name: ";

    std::getline(std::cin, name, '#');

    std::cout << "Welcome to here!" << std::ends << name << std::endl;

    std::cout << std::endl;

    return 0;

    }

    //**输入:

    wonderful#Mr.Ling

    //输出:

    wonderful

    ///////////////////////////////////////////////////////////////////////////////////////////

    (EOF是C语言中为了区分有效数据和输入结束符的。

    EOF的输入由系统锁定。windows下是ctrl+z,linux/unix下是ctrl+d。)

    getline不是C库函数,而是C++库函数。它遇到以下情况发生会导致生成的本字符串结束:

    (1)到文件结束,(2)遇到函数的定界符,(3)输入达到最大限度。

    getline()函数在while中作为条件判断。

    #include "stdafx.h"

    #include <iostream>

    #include <string>

    using namespace std;

    int main()

    {

    string line;

    while (getline(cin, line))

    cout << line << endl;

    return 0;

    }

    大家会发现运行时一般的输入都不能够跳出循环,可能有时还会出现莫名的错误。但是这到底是什么原因造成的呢!下面就来分析一下:

    getline()函数的原型是istream& getline ( istream & is , string & str , char delim );

    int main()

    {

    string line;

    cout << "Please input a line: " << endl;

    while (getline(cin, line,'#'))

    cout << line << endl;

    return 0;

    }

    然后,那么当我们输入 "You are wonderful!#Mr. Ling" 时,但是,有效的输入是 "You are wonderful!",#后面的内容并没有存入。程序运行的结果如:

    //输入:

    You are wondreful!#LingKing

    //输出:

    You are wonderful!

    在这里设置‘#’为终止符时,当再输入’ ’时也不会影响。在#之前的内容都会照样输出。例如:

    //输入: //含有’ ’的输入

    Hello world!

    You are wonderful!

    Mr. Ling#wonderful!

    //输出: //照样输出

    Hello world!

    You are wonderful!

    Mr. Ling

    通过getline()函数一个小小的实例,那么把getline()函数作为while的判断语句会怎么样的呢!

    就分析一下while(getline(cin,line))

    (注意:这里默认回车符停止读入,按Ctrl+Z(Windows)(Ctrl+D(Linux))或键入EOF(参考MSDN)回车即可退出循环。)

    这个语句中,while判断语句的真实判断对象是cin的状态,也就是判断当前是否存在有效的输入流。

    而输入流是对象,判断的是流返回的状态。所以正常的情况下,你怎么输入都是跳不出它的循环。

    在这之中可能会用些同志误以为while判断语句的判断对象是line(也就是line是否为空),想通过回车来跳出循环,却发现不能跳出循环。

    而回车和设置的终止符都是终止getline()函数的读取操作的。但是while判断语句判断的是getline()函数的输入流是否有效。所以呢!

  • 相关阅读:
    (Power Strings)sdutoj2475
    KMP(http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2772)
    spfa 判断负环 (转载)
    图的存储
    图结构练习——判断给定图是否存在合法拓扑序列(sdutoj)
    poj1753Flip Game(dfs)
    poj2524(简单并查集)
    VC++ GetModuleFileName()获取路径字符串中带波浪线~
    VC++ : error LNK2005: ... already defined in *.obj
    InstallSheild的一些常量
  • 原文地址:https://www.cnblogs.com/xiaofeiIDO/p/8574042.html
Copyright © 2011-2022 走看看