C++循环中搭配getline使用to_string存储文件行是否可行?
报错原因
编译报错的核心原因是getline函数的第二个入参要求是可修改的std::string左值引用,用来存储读到的行内容,而to_string(i)生成的是临时字符串右值,无法被写入,自然匹配不到对应的函数签名。
同时你原代码中的循环变量i没有初始化,属于未定义行为,哪怕参数正确也会出现异常。
最优实现方案
不需要提前硬编码总行数,用std::vector<std::string>存储所有行即可,下标对应你需要的序号i,后续可以直接按序号调用:
#include <fstream> #include <vector> #include <string> #include <iostream> int main() { std::ifstream inputFile("input.txt"); // 必须先判断文件是否打开成功,避免后续异常 if (!inputFile.is_open()) { std::cerr << "打开文件失败" << std::endl; return 1; } std::vector<std::string> lines; std::string curLine; // 读到文件末尾自动结束循环 while (std::getline(inputFile, curLine)) { lines.push_back(curLine); } inputFile.close(); // 后续调用方式:lines[0]对应第一行内容,lines[1]对应第二行,以此类推 // 示例输出验证 for (int i = 0; i < lines.size(); i++) { std::cout << "第" << i + 1 << "行:" << lines[i] << std::endl; } return 0; }
硬编码总行数的修复写法
如果你确实需要提前指定总行数,可以按如下方式修改你的原代码:
#include <fstream> #include <vector> #include <string> int main() { std::ifstream inputFile("input.txt"); if (!inputFile.is_open()) { return 1; } int totalLines = 3; std::vector<std::string> lines(totalLines); // 注意初始化i为0 for(int i = 0; i < totalLines; i++){ std::getline(inputFile, lines[i]); } inputFile.close(); return 0; }
内容的提问来源于stack exchange,提问作者Apeirologue
相关产品推荐
相关产品推荐

