根据空格和逗号分割输入字符串

Posted

技术标签:

【中文标题】根据空格和逗号分割输入字符串【英文标题】:Splitting input string based on whitespace and commas 【发布时间】:2016-05-02 04:04:02 【问题描述】:

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

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

它认为 a(space)r3 是一个元素。它根据逗号正确拆分整行,但初始读取不正确,因为我还需要它来拆分 a 和 r3。我该怎么做?

【问题讨论】:

operator&gt;&gt; 读取空格分隔的标记。所以它会跳过空格,然后 std::string 会读取所有字符,直到下一个空格(或换行符)字符。 【参考方案1】:

这样就可以了。

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&gt;&gt;instruction 默认读取直到空白。要阅读整行,您必须改用 getline。

【讨论】:

会得到最后一个逗号后的最后一位吗? @Rishit 输出结果为 r3 1 2。因此它从 r1 和 r2 中删除了 r(这很好,因为无论如何我都需要这样做),但不是从 r3 中删除。为什么不从 r3 中删除 r? 没关系。这是我的文件格式错误。 @xaxxon 是的,它会的。我已经在我的系统上检查过了。 getline 将读取直到到达流的末尾或到达分隔符。所以如果我们在行尾有逗号并不重要,因为流在​​那里结束。 @Noobgineer 如果您的文件中没有空格,它将忽略第一个字符,这就是您将获得 r3 1 2 的原因。您现在可以修改它!【参考方案2】:

给你:

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

size_t find_first_of( const basic_string&amp; 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);


【讨论】:

我看不出这对我的问题有什么帮助,因为它只是返回在找到特定字符串之前必须搜索的次数。我需要假设格式而不是特定内容来做到这一点。即,我不知道它将是什么字符/字符串,但我只知道格式。 我读错了一点......在这种情况下,只需搜索第一个空格,然后在第一个空格的位置后用逗号分隔。它只需要两个部分。 std::string::find 将对此有用。

以上是关于根据空格和逗号分割输入字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何用逗号分割不跟空格的字符串?

根据长度和逗号拆分输入字符串(送货地址数据)

SQL拆分逗号分隔的字符串

如何用逗号和空格java分割表达式

C#关于用逗号分割字符串?

SQL拆分逗号分隔的字符串