You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免两次调用getline()读取文件中的字符串及长度?

解决方法

你可以用几种方式跳过读取整数后残留的换行符,避免重复调用getline():

方法1:用ignore()跳过换行(推荐鲁棒写法)

在读取n之后,调用ignore()跳过输入流中从当前位置到换行符的所有字符(包括换行本身),确保后续getline()能直接读取第二行的字符串:

#include <fstream>
#include <limits>

int main() {
    ifstream input;
    input.open("input.txt");
    int n;
    input >> n;
    // 跳过所有字符直到遇到换行,包括换行符
    input.ignore(numeric_limits<streamsize>::max(), '\n');
    // 分配n+1个字符空间,留位置存字符串终止符'\0'
    char* str = new char[n + 1];
    input.getline(str, n + 1);
    
    // 记得用完后释放动态分配的内存
    delete[] str;
    return 0;
}

如果能确定第一行只有数字加单个换行,也可以简化成input.ignore();,但上面的写法能处理第一行数字后带多余空白的情况,更可靠。

方法2:用get()读取并丢弃换行符

因为换行符是单个字符,直接调用input.get()读取该字符并丢弃:

#include <fstream>

int main() {
    ifstream input;
    input.open("input.txt");
    int n;
    input >> n;
    // 读取并丢弃换行符
    input.get();
    char* str = new char[n + 1];
    input.getline(str, n + 1);
    
    delete[] str;
    return 0;
}

这个方法简单,但如果第一行数字后有多个空白字符(比如空格加换行),只会跳过第一个字符,鲁棒性不如方法1。

另外要注意:分配字符数组时最好多留一个位置(n+1),因为getline()会自动在字符串末尾添加终止符\0,避免缓冲区溢出风险。

内容的提问来源于stack exchange,提问作者Sasha Dynin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:40:28