解析坐标从文件使用c++
Parsing coordinates from file using c++
我有一个关于解析坐标从一个文件到我的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;
}
}
问题来自:
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
问题的根源在于您的需求没有被详细说明。例如:
-
你能假设每个坐标都是从0到9吗?或者有坐标更多的数字?
-
是否存在负的坐标?你应该能够处理一个负号字符吗?是否允许加号字符,例如"-1,+1"?
-
哪里允许空白 ?
-
您是否必须处理错误,例如当文件为空或根本没有',',或者如果有多个逗号,或者如果其中一个假定的数字不包含数字?
-
您是否允许忽略正确输入之后的所有,即"1,2xxx"之类的内容?
对于最简单的需求,您可以这样做:
if (data[1] == ',') {
int x = data[0] - '0';
int y = data[2] - '0';
}
但这显然不够好。所以你确实有更复杂的需求,我认为你应该多考虑一下。只有这样,你才能写出真正正确的程序。
最后,请记住,用户输入总是一件非常复杂的事情,通常很难考虑和涵盖每一个角落的情况,但是每个人都喜欢正确、直观地处理用户输入并以最精确的方式报告错误的程序,不是吗?:)
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到