【问题标题】:Parsing coordinates from file using c++使用 C++ 从文件中解析坐标
【发布时间】:2014-03-16 16:17:26
【问题描述】:

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

【问题讨论】:

  • 像往常一样,当这类问题出现时,我建议您再次阅读std::getlinestd::istringstreamstd::getline
  • 在这种情况下,您可能还想研究结构和std::stoi
  • 除了我的回答,请将您的char[] 替换为std::string,将std::string 传递给const&amp;(至少在C++98/03 中),注意惯用循环C++ 流的形式(即使用!indata 而不是good() 函数的任何东西),并且更喜欢独立的std::getline 函数而不是getline 成员函数。
  • while(indata.good()) 不不不不不

标签: c++ string parsing coordinates delimiter


【解决方案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,然后您可以使用&gt;&gt; 轻松解析数据:

std::istringstream iss(data); // e.g. data = "1,2" 
int first_int, second_int;
char delimiter;
iss >> first_int >> delimiter >> second_int;
           |            |            |
           1           ','           2

【讨论】:

    【解决方案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';
    }
    

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

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

    【讨论】:

    • 未指定要求,因为这只是一个测试。我用作程序输入的文件不是用户输入。这是一个学校作业,要求我们必须制作一个外部文本文件才能将坐标放入我们的程序中。我们的坐标从 1 到 10 不等。我仍然想知道为什么我的 while 循环没有覆盖整个文件。
    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多