我有一个关于将文件中的坐标解析为我的C ++程序的问题。
文件"file.txt"
的内容由一行组成:"1,2"
1
需要是X坐标。 ','
是分隔符。而2
是Y坐标。
我的程序输出是:"1"
。
看起来我的程序只将字符串放在向量中的分隔符前面,然后认为它是文件的结尾。
我该如何解决这个问题?
您可以在此处找到我的代码。提前谢谢!
#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include <sstream>
char data[220];
void parseString(std::string string);
int main(int argc, char **argv) {
std::ifstream indata("file.txt");
std::vector <std::string> buffer(5);
int i = 0;
while(indata.good())
{
indata.getline(data, 220);
parseString(data);
++i;
}
return 0;
}
void parseString(std::string string){
std::string delimiter = ",";
size_t pos = 0;
std::string token;
std::vector<std::string> tempVector(2);
int i = 0;
while ((pos = string.find(delimiter)) != std::string::npos) {
token = string.substr(0, pos);
tempVector[i] = token;
string.erase(0, pos + delimiter.length());
}
for(std::string S : tempVector){
std::cout << S << std::endl;
}
}
答案 0 :(得分:1)
问题来自:
while ((pos = string.find(delimiter)) != std::string::npos) {
token = string.substr(0, pos);
tempVector[i] = token;
string.erase(0, pos + delimiter.length());
}
在第一次循环解析后(在while
中),您删除第一部分,即"1,"
,只留下"2"
。然后你会停在这里因为没有更多的分隔符。这就是为什么你只有1
。
您只需将string data
放入std::istringstream
,然后就可以使用>>
轻松解析数据:
std::istringstream iss(data); // e.g. data = "1,2"
int first_int, second_int;
char delimiter;
iss >> first_int >> delimiter >> second_int;
| | |
1 ',' 2
答案 1 :(得分:0)
问题的根源是您的要求未明确。例如:
你能假设每个坐标都是0到9吗?或者是否有更多位数的坐标?
可以有负坐标吗?你应该能够处理减号吗?是否允许使用加号字符,例如“-1,+ 1”?
空白允许在哪里?
您是否必须处理错误,例如当文件为空或根本没有','或者有多个逗号,或者是否有一个假定的数字时不包含数字?
您是否可以忽略正确输入后的所有 ,例如“1,2xxx”?
对于这里可以想到的最简单的要求,你可以这样做:
if (data[1] == ',') {
int x = data[0] - '0';
int y = data[2] - '0';
}
但这显然不够好。所以你做有更复杂的要求,我认为你应该多考虑一下。只有这样,你才能制作一个非常正确的节目。
总而言之,请注意用户输入始终是一件非常复杂的事情,通常很难考虑并涵盖每一个角落的案例,但每个人都喜欢能够正确,直观地处理用户输入并报告错误的程序。最精确的方式可能,不是吗? :)