基于空格和逗号分割输入字符串

时间:2016-05-02 04:04:03

标签: c++ string parsing

我正在从文件中读取格式化的行,需要解析它并将一些结果输出到文件中。我遇到的麻烦是正确解析输入以处理空格和逗号。文件中的行格式可以是以下内容:

a r3, r2, r1
ah r8, r5, r6, r7
ai r10, i10, r127

所以我可以拥有4-5个不同的元素。第一个元素是"命令",然后是一个空格,然后是用逗号和空格分隔的值。

我目前的实施如下:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
#include <bitset>
using namespace std;

void main()
{
    string instruction;
    vector<string> myString;
    ifstream inFile;
    inFile.open("myfile.txt");
    int i = 0;


    if (inFile.is_open()){
        cout << "test" << endl;
        //Read until no more lines in text file to read
        //while (getline(inFile, instruction))
        while (inFile >> instruction)
        {

            istringstream ss(instruction);
            string token;
            //Separate string based on commas and white spaces
            while (getline(ss, token,',')){
                //getline(token, token, ' ');

                //Push each token to the vector
                myString.push_back(token);
                cout << myString[i] << endl;
                i++;
            }

        }
    }
    system("pause");
}

但这不起作用。如果我使用a r3, r2, r1进行测试,我只会得到a并且程序会停止阅读,因为它会看到空格。

我尝试的另一个版本是将文件的读取更改为while (getline(inFile, instruction)),但这会将我的字符串拆分为:

a r3
r1
r2

它认为(空格)r3是一个元素。它基于逗号正确分割整行,但初始读取不正确,因为我需要它也分割a和r3。我怎么能这样做?

2 个答案:

答案 0 :(得分:6)

这将完成这项工作。

if (inFile.is_open()){
    cout << "test" << endl;
    //Read until no more lines in text file to read
    while (getline(inFile, instruction))
    {

        istringstream ss(instruction);
        string token;
        //Separate string based on commas and white spaces
        getline(ss,token,' ');
        myString.push_back(token);
        cout << myString[i] << endl;
        i++;

        while (getline(ss, token,',')){
            ss.ignore();
            myString.push_back(token);
            cout << myString[i] << endl;
            i++;
        }

    }
}

点数:
getline(inFile,instruction)将为您提供整条线 getline(ss,token,' ')读到白色空间
getline(ss,token,',')读到逗号为止 最后,ss.ignore(),忽略流中的字符。

请务必注意,如果到达“结束流”,则getline会停止。

默认情况下,您的inFile>>instruction会一直读到空格。要阅读整行,您必须使用getline。

答案 1 :(得分:-1)

你走了:

http://en.cppreference.com/w/cpp/string/basic_string/find_first_of

size_t find_first_of( const basic_string& str, size_type pos = 0 )

搜索str ...

中的任何字符
#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s = "this is some, text";
  size_t position = -1;
  do {
      position = s.find_first_of(" ,", position+1);
  } while(position != std::string::npos);

}