如何避免两次调用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
相关产品推荐
相关产品推荐

