使用c++; 我有一个问题,就是把一个文件中的坐标解析成我的C++程序。

使用c++; 我有一个问题,就是把一个文件中的坐标解析成我的C++程序。,c++,string,parsing,coordinates,delimiter,C++,String,Parsing,Coordinates,Delimiter,文件“file.txt”的内容由一行组成:“1,2” 1需要是X坐标。,“是分隔符。2是Y坐标 我的程序的输出是:“1” 看起来我的程序只是将字符串放在向量中分隔符的前面,然后认为它是文件的结尾 我怎样才能解决这个问题 你可以在这里找到我的代码。提前谢谢 #include <string> #include <vector> #include <fstream> #include <iostream> #include <sstream>

文件
“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;
    }
}
#包括
#包括
#包括
#包括
#包括
字符数据[220];
void parseString(std::string字符串);
int main(int argc,字符**argv){
std::ifstream indata(“file.txt”);
std::向量缓冲区(5);
int i=0;
while(indata.good())
{
获取行(数据,220);
解析字符串(数据);
++一,;
}
返回0;
}
void parseString(std::string){
std::字符串分隔符=“,”;
大小\u t pos=0;
字符串标记;
std::向量tempVector(2);
int i=0;
while((pos=string.find(delimiter))!=std::string::npos){
token=string.substr(0,pos);
tempVector[i]=令牌;
erase(0,pos+delimiter.length());
}
for(std::string S:tempVector){

std::cout问题来自:

while ((pos = string.find(delimiter)) != std::string::npos) {
    token = string.substr(0, pos);
    tempVector[i] = token;
    string.erase(0, pos + delimiter.length());
}
在第一次循环解析之后(在
,而在
中),删除第一部分,即
1,
,这只剩下
“2”
。然后您将在这里停止,因为其中没有更多的分隔符。这就是为什么您只得到
1


您只需将
字符串数据
放入,然后就可以使用
>
轻松解析数据:

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';
    }
    
    但这显然不够好。所以你确实有更复杂的需求,我认为你应该对它们进行更多的思考。只有这样,你才能产生一个真正正确的程序


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

    像往常一样,当出现此类问题时,我建议请您重新查看<代码> > ch> []代码>代码> > STD::String < /C++ >,通过<代码> STD::String < /C> >由代码> const和< /C> >(至少在C++ 98/03)中,请注意C++流的惯用循环形式。(也就是说,使用
    !indata
    而不是使用
    good()
    函数),并且更喜欢独立的
    std::getline
    函数而不是
    getline
    成员函数。
    while(indata.good())
    No。No No No nothine由于这只是一个测试,未指定要求。我用作程序输入的文件不是用户输入。它用于学校作业,要求我们必须制作一个外部文本文件以将坐标放入程序中。我们的坐标从1到10不等。我仍然想知道为什么我的while循环不包括完整的文件。