C++中使用ifstream读取含多空格姓名列的问题
解决C++读取含空格的姓名列问题
你的问题出在默认的>>运算符会把所有空格(不管多少个)都当作分隔符,所以当姓名只有1个空格时,name3会去读下一行的第一个数据,导致错位。要把姓名作为单个变量读取,得先读完前四列,再读取当前行剩下的所有内容当作姓名。
可行方案代码示例
#include <fstream> #include <string> #include <limits> #include <algorithm> int main() { std::ifstream infile("your_file.txt"); std::string recordDate; double relativeHumidity, airTemp; char tempUnit; std::string name; // 跳过表头行 std::string header; std::getline(infile, header); while (infile >> recordDate >> relativeHumidity >> airTemp >> tempUnit) { // 方式1:跳过tempUnit后的空格,直接读取姓名 infile.ignore(std::numeric_limits<std::streamsize>::max(), ' '); std::getline(infile, name); // 方式2:读取整行后自动去除姓名前的空格(适配空格数量不确定的情况) // std::getline(infile, name); // name.erase(name.begin(), std::find_if(name.begin(), name.end(), [](int ch) { // return !std::isspace(ch); // })); // 验证读取结果 std::cout << "日期: " << recordDate << "\n"; std::cout << "相对湿度: " << relativeHumidity << "\n"; std::cout << "气温: " << airTemp << tempUnit << "\n"; std::cout << "姓名: " << name << "\n\n"; } infile.close(); return 0; }
方案说明
- 先用
>>读取前四个无空格的字段,这部分逻辑不受空格影响,能稳定读取数据。 - 两种读取姓名的方式:
- 方式1通过
ignore跳过tempUnit后的所有空格,确保getline直接读取姓名内容。 - 方式2直接读取整行剩余内容,再手动去除姓名前的空格,适配列间空格数量不固定的场景。
- 方式1通过
getline会读取当前行剩余的所有字符(包括空格)直到换行符,完美匹配姓名含1-2个空格的需求。
内容的提问来源于stack exchange,提问作者shahmeer arhsad
相关产品推荐
相关产品推荐

