C++中getline函数用法(修正调试ok)

本文深入探讨了C++中getline函数的使用方法,包括其语法、工作原理及常见应用场景。通过具体实例展示了如何利用getline函数从文本文件中读取信息并处理数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

C++中getline函数用法

 

 getline()    语法:        

 istream &getline( char *buffer, streamsize num );   

 istream &getline( char *buffer, streamsize num, char delim );   

    用getline()读取字符到buffer中,buffer在代码中通常体现为一个字符数组,streamsize num是一次读入多少个字符,   num - 1个字符已经读入,       当碰到一个换行标志,  碰到一个EOF,  或者任意地读入,直到读到字符delim。delim字符不会被放入buffer中。delim字符可以自已设定,默认为回车符'/n' 

我的理解:

第一个参数为要存储的指定字符数组。

第二个参数为抽取、读取指定数目的字符。 

第三个参数指定结束字符,默认为"\n";

 

#include <iostream.h>
#include<stdlib.h>
#include <iomanip.h>
#include <fstream.h>

using namespace std;

const int N=10;
int main()
{
 char str[N];
 ifstream fin;
    fin.open("data.txt");
 if (!fin)
 {
  cout<<"error "<<endl;
  exit(1);
 }
 while(fin.getline(str,sizeof(str)))
 {
  cout<<str;
  cout<<endl;
 }
 cout<<endl;

 fin.clear();
 cin.get();
 return 0;
}

 

下面是另外整的实例

例如:文件data.txt内容

1 轻 无 疼 烧 轻
2 轻 无 疼 正常 轻

 

通过C++ fstream和getline的方法将信息读到一个二维数组string data[][]

 

方法一:(适用于已知行数和列数,且要求以空格或制表符间隔)

#include <fstream>
#include <iostream>
using namespace std;
#include <string>


int main()
{
 ifstream ifile("data.txt");
 string data[2][6];
 int i,j;
 //while(!ifile.eof())
 //{
  //ifile.getline(data,100);
  for(i = 0; i < 2; i ++)
  {
   for(j = 0; j < 6; j ++)
   {
    ifile>>data[i][j];
    cout<<data[i][j];
   }
  }
  ifile.close();
}

 

方法二:(未知行数和列数 且 分割符不限于 空格)

 

#include <fstream>
#include <string>
#include <vector>
#include <iostream>
using namespace std;

typedef vector<vector<string> > vvs;

void main()
{
    ifstream infile("data.txt");
    infile>>noskipws;//不忽略空白且把每行最后那个'\n'也读进来
 
    //判断行数和列数,文件中每列数据以空格隔开
    int row, col, k;
    row = col = 0;

    char chr;
    while(infile>>chr)
    {
        switch(chr)
        {
         case '\n':  //判断读入字符是否为换行符
             ++ row;  //是换行符则行数+1
             col = 0; //是换行符则列数清零
         break;
         case ' ':  //判断读入字符是否为空格
         ++ col;  //则列数+1
         break;
         default:;
        }
     }
    infile.close();  //关闭文本文件

    row ++; col++;  //读文件得到的行列数均加1才是真正的行列数(注意:文件最后没有空白行)
 
    vvs data; // 定义二维字符串数组
    data.resize(row);
    for(k = 0; k < row; k ++)
        data[k].resize(col);
 
    ifstream infile2("data.txt");

    int trow, tcol;
    trow = tcol = 0;

    string str;
    while(trow < row)//循环比较,以行数作为限制
    {
        while(tcol < col-1)
        {
            getline(infile2,str,' '); //以空格为分隔对象,进行数据读入
            data[trow][tcol] = str;  //将空格前的数据保存到相应的字符串数组中
            tcol++;      //保存好数据后列数+1
        }
        getline(infile2,str,'\n');  //将回车符作为对象进行数据输入,以判断一行是否结束
        data[trow][tcol] = str;   //将回车符前面的数据读入到相应的字符串数组中
        tcol = 0;      //列数赋值为1,准备下一行的判断
        trow ++;      //行数+1
    }
    infile2.close();

}

<think>我们正在讨论C++getline函数的使用方法。根据引用内容,getline函数主要用于读取整行输入,包括空格,直到遇到换行符或指定的分隔符。引用[3]和[4]提供了重要信息:getline有两个版本,一个用于C风格字符串(字符数组),另一个用于C++string对象。同时,getline可以指定分隔符(默认是换行符)。使用getline读取string对象的基本语法:#include <string>stringline;getline(cin,line);//从标准输入读取一行,直到换行符(换行符被丢弃)使用getline读取字符数组的基本语法(实际上是istream的成员函数):char str[100];cin.getline(str,100);//读取最多99个字符(保留一个给'\0')或者直到遇到换行符(换行符被丢弃)另外,还可以指定分隔符,例如:getline(cin,line,':'); //读取直到遇到':',丢弃':'注意:与cin>>的区别是,cin>>遇到空格、制表符、换行符就会停止读取,而getline可以读取空格,直到遇到换行符(或指定分隔符)才停止。引用[2]展示了getline在循环中读取多行直到文件结束(或输入结束)的用法。因此,回答应该包括:1.两种getline的使用(字符数组和string)2.指定分隔符的用法3.与cin>>的对比4.示例代码同时,根据引用[1]和[3],我们注意到cin.get()与cin.getline()在处理换行符上的区别:cin.get()会将换行符留在输入流中,而cin.getline()会丢弃换行符。但是用户的问题是关于getline的,所以我们重点放在getline上。另外,引用[5]提到getline的结束条件:文件结束、遇到定界符、达到最大限制。下面组织回答:</think>### C++getline函数的使用方法 `getline()`是C++中用于读取整行输入的函数,能处理包含空格的字符串输入,克服了`cin >>`遇到空格就终止读取的限制。根据使用场景不同,分为两种形式: #### 1. **读取到`string`对象(推荐)** ```cpp #include <iostream> #include <string> using namespace std; int main() { string line; // 读取整行(默认以换行符结束) getline(cin, line); cout << "输入内容: " << line << endl; // 指定分隔符(读取到':'停止) getline(cin, line, ':'); cout << "分隔符内容: " << line << endl; return 0; } ``` - **特点**:自动处理内存分配,无需预设缓冲区大小。 - **分隔符**:第三个参数可指定结束符(默认`'\n'`),读取后丢弃该字符[^3][^4]。 #### 2. **读取到字符数组(C风格字符串)** ```cpp #include <iostream> using namespace std; int main() { char buffer[100]; // 读取整行(最多99字符+'\0') cin.getline(buffer, 100); cout << "字符数组: " << buffer << endl; // 指定分隔符(读取到'#'停止) cin.getline(buffer, 100, '#'); cout << "自定义分隔符: " << buffer << endl; return 0; } ``` - **特点**:需预先分配固定大小缓冲区,存在溢出风险。 - **语法**:`cin.getline(数组名, 最大字符数, [分隔符])`[^1][^3]。 --- #### 🚫 常见错误与注意事项 1. **混合使用`cin >>`和`getline()`** `cin >>`会留下换行符在输入流,导致后续`getline()`立即结束。需用`cin.ignore()`清除残留字符: ```cpp int num; string text; cin >> num; cin.ignore(); // 清除换行符 getline(cin, text); // 正常读取 ``` 2. **缓冲区溢出风险(字符数组版本)** 若输入超过预设大小,会截断数据并设置`failbit`,需用`cin.clear()`重置状态[^5]。 3. **循环读取多行** 结合`while`循环处理不定量输入(如文件结束): ```cpp string line; while (getline(cin, line)) { cout << line << endl; } ``` 当遇到`EOF`(Windows: `Ctrl+Z`, Linux: `Ctrl+D`)或读取失败时终止[^2]。 --- #### 💡 与`cin.get()`的区别 | 函数 | 是否保留换行符 | 目标类型 | 安全性 | |---------------|----------------|----------------|--------------| | `cin.getline` | 丢弃 | 字符数组 | 自动添加`\0` | | `cin.get` | 保留在流中 | 字符数组/字符 | 需手动处理 | ```cpp char arr1[20], arr2[20]; cin.get(arr1, 20); // 换行符留在输入流 cin.get(); // 需额外读取换行符 cin.getline(arr2,20);// 直接读取下一行 ``` --- #### 总结应用场景 - 读取包含空格的字符串(如句子、文件路径)。 - 按自定义分隔符解析数据(如`CSV`文件)。 - 安全处理用户输入(避免`cin >>`意外截断)[^4][^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值