返回空变量的获取行项

getline item returning empty variable

本文关键字:获取 变量 返回      更新时间:2023-10-16

我正在尝试读取文本文件并将行分隔为城市和位置。对于大多数线路,一切都在工作,但是对于我来说,我得到了一个

terminate called after throwing and instance of 'std::invalid_argument'
   what(): stoi
Aborted (core dumped)

经过一番调查,我发现它挂在秘鲁利马的 2 上。我可能是 getline 函数给了它无法处理的东西,但是在文档前面完全相同的位置存在完全相同的数字实例。

...
Hobart, Tasmania: 42 52 S 147 19 E
Hong Kong, China: 22 20 N 114 11 E
Iquique, Chile: 20 10 S 70 7 W
Irkutsk, Russia: 52 30 N 104 20 E
Jakarta, Indonesia: 6 16 S 106 48 E
Johannesburg, South Africa: 26 12 S 28 4 E
Kingston, Jamaica: 17 59 N 76 49 W
Kinshasa, Congo: 4 18 S 15 17 E
Kuala Lumpur, Malaysia: 3 8 N 101 42 E
La Paz, Bolivia: 16 27 S 68 22 W
Leeds, England: 53 45 N 1 30 W
Lima, Peru: 12 0 S 77 2 W
Lisbon, Portugal: 38 44 N 9 9 W
Liverpool, England: 53 25 N 3 0 W
London, England: 51 32 N 0 5 W
Lyons, France: 45 45 N 4 50 E
Madrid, Spain: 40 26 N 3 42 W
...

这是我认为引发错误的代码部分。如果需要,我可以发布更多,但我认为这是相关的部分。

while(is_more_stuff_there(file_to_read))
{
    getline(file_to_read, line);
    // parse city
    index = line.find(':');
    city_name = line.substr(0 , line.find(':'));
    istringstream position_stream(line.substr(index + 2 , line.find(':')));
    cout << city_name << endl;
    // initialize an array to store the parsed values from the position_string
    string position_array[6];
    string item;
    int i = 0;
    // fill the array, split by spaces
    while (getline(position_stream, item, ' '))
    {
        position_array[i] = item;
        i++;
        cout << item << endl;
    }
    cout << position_array[4] << endl;
    // initialize the position variables
    lat_min = stoi(position_array[0]);
    lat_sec = stoi(position_array[1]);
    long_min = stoi(position_array[3]);
    long_sec = stoi(position_array[4]);
    // determine positivity of lats and longs
    if (position_array[2] == "S") { lat_min *= -1; lat_sec *= -1; }
    if (position_array[5] == "E") { long_min *= -1; long_sec *= -1; }   
    vertex city(city_name, lat_min, lat_sec, long_min, long_sec);
    g.add_vertex(city);
}

您的文本文件中有一个非打印字符,就在有问题的 2 之前。 你可以通过使用od -x找到它到底是什么(如果你在Unix盒子上)。或者干脆删除该行并重新键入。

我可以通过您的代码看到的一个问题是传递给substr函数的第二个参数似乎是错误的。 它应该是要提取的子字符串的长度,但不必与:的索引一致。 您可以简单地省略第二个参数来获取整个剩余的子字符串。

std::istringstream position_stream(line.substr(index + 2));

如果只在 index 中添加 1,则代码还将解析冒号后没有空格的输入。

虽然没有根本错误,但可以通过使用 C++ 样式提取运算符来简化代码。 您可以直接从流中读取四个字段。

int lat_min, lat_sec, long_min, long_sec;
std::string ns, we;
position_stream >> lat_min >> lat_sec >> ns >> long_min >> long_sec >> we;

然后继续使用所需的任何逻辑处理它们。