使用c ++解析文件中的坐标

时间:2014-03-16 16:17:26

标签: c++ string parsing coordinates delimiter

我有一个关于将文件中的坐标解析为我的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;
    }
}

2 个答案:

答案 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)

问题的根源是您的要求未明确。例如:

  1. 你能假设每个坐标都是0到9吗?或者是否有更多位数的坐标?

  2. 可以有坐标吗?你应该能够处理减号吗?是否允许使用加号字符,例如“-1,+ 1”?

  3. 空白允许在哪里?

  4. 您是否必须处理错误,例如当文件为空或根本没有','或者有多个逗号,或者是否有一个假定的数字时不包含数字?

  5. 您是否可以忽略正确输入后的所有 ,例如“1,2xxx”?

  6. 对于这里可以想到的最简单的要求,你可以这样做:

    if (data[1] == ',') {
        int x = data[0] - '0';
        int y = data[2] - '0';
    }
    

    但这显然不够好。所以你有更复杂的要求,我认为你应该多考虑一下。只有这样,你才能制作一个非常正确的节目。

    总而言之,请注意用户输入始终是一件非常复杂的事情,通常很难考虑并涵盖每一个角落的案例,但每个人都喜欢能够正确,直观地处理用户输入并报告错误的程序。最精确的方式可能,不是吗? :)