解析坐标从文件使用c++

Parsing coordinates from file using c++

本文关键字:c++ 文件 坐标      更新时间:2023-10-16

我有一个关于解析坐标从一个文件到我的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

问题的根源在于您的需求没有被详细说明。例如:

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

  2. 是否存在负的坐标?你应该能够处理一个负号字符吗?是否允许加号字符,例如"-1,+1"?

  3. 哪里允许空白 ?

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

  5. 您是否允许忽略正确输入之后的所有,即"1,2xxx"之类的内容?

对于最简单的需求,您可以这样做:

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

但这显然不够好。所以你确实有更复杂的需求,我认为你应该多考虑一下。只有这样,你才能写出真正正确的程序。

最后,请记住,用户输入总是一件非常复杂的事情,通常很难考虑和涵盖每一个角落的情况,但是每个人都喜欢正确、直观地处理用户输入并以最精确的方式报告错误的程序,不是吗?:)