返回空变量的获取行项
getline item returning empty variable
我正在尝试读取文本文件并将行分隔为城市和位置。对于大多数线路,一切都在工作,但是对于我来说,我得到了一个
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;
然后继续使用所需的任何逻辑处理它们。
相关文章:
- 使用递归时获取变量的奇怪值
- 附加调试器并以编程方式获取变量地址 Visual Studio
- 使用基地址和偏移量获取变量的地址
- 如何在C++中从标准输入中获取变量输入
- 如何在每次迭代后在循环中获取变量的值?
- 声明后如何获取变量及其大小?
- C++日历(无法获取变量的值以返回到主函数)
- 我如何实现从其基类获取变量的构造函数
- 从派生类 c++ 中获取变量
- 如何在不使用返回的情况下从函数获取变量的地址(指针)
- 获取变量类型名称
- ClangTool 如何获取变量声明中模板参数的位置?
- 您什么时候使用哪种方法从另一个文件中获取变量
- 如何通过C FFI从Prolog中获取C 变量
- C++从 PHP 获取变量
- 获取变量的中间范围值
- 组合构造函数从成员变量中获取变量
- c++通过调用system()来获取变量集
- 如何从模板g++中获取变量名
- 如何获取 C/C++ 变量的属性