C ++用空格和逗号分隔字符串

时间:2019-11-29 20:53:09

标签: c++ file vector file-io

我试图读取一个文本文件,用逗号和空格“,”分隔整数值,并将除“,”之外的每个单独的整数添加到整数向量中。以下代码仅显示第一个值。我在做什么错了?

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

int main()
{
std::vector<int> vecOfStrs;
std::ifstream fileIn("Scores.txt");
std::string str;

while (std::getline(fileIn, str)) {
    if (str.size() > 0) { //If there is any string at all do...

        std::stringstream ss(str); //std operator that turns str string into a stringstream to be operated on
        for (int i; ss >> i;) {
            vecOfStrs.push_back(i);
            if (ss.peek() == ' ,')
                ss.ignore();
        }
    }
}

fileIn.close();

for (size_t i = 0; i < vecOfStrs.size(); i++) {
    std::cout << vecOfStrs[i] ;
}

return 0;
}

这是文本文件“ scores.txt” ::

76, 89, 150, 135, 200, 76, 12, 100, 150, 28, 178, 189, 167, 200, 175, 150, 87, 99, 129, 149, 176, 
200, 87, 35, 157, 189

4 个答案:

答案 0 :(得分:1)

我想出是否有人在此寻找答案。使用

if (ss.peek() == ',' || ss.peek() == ' ')

检查它是空格还是逗号而不是

if (ss.peek() == ' ,')

答案 1 :(得分:1)

将for循环更改为此,它将起作用!与您的其余代码一起在我这边进行了测试。

for(string i; ss >> i;)//treat as string for string manipulation
{
    size_t pos=str.find(',');  //look for a comma
    if(pos!=std::string::npos) i.erase(pos); //if comma is found, erase it!
    vecOfStrs.push_back(stoi(i));  //convert string to integer
}

基本上:将其读取为字符串,find()erase()不需要的内容,然后将其用作输入。

我在您的代码中发现的一个问题是您正在寻找2个字符。您只能偷看1个字符(请参见std::istream::peek)。我认为这就是导致意外行为的原因。

干杯!

答案 2 :(得分:0)

无需诉诸peek()ignore()

您只需将所有逗号替换为一个空格,然后使用std::istringstream.

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>

int main()
{
   std::vector<int> vecOfStrs;
   std::string str = "76, 89, 150, 135, 200, 76, 12, 100, 150, 28, 178, 189, 167, 200,"
                      "175, 150, 87, 99, 129, 149, 176, 200, 87, 35, 157, 189";

   // replace all commas with a space
   std::replace(str.begin(), str.end(), ',', ' ');                      

   std::stringstream ss(str); 
   for (int i; ss >> i;) 
       vecOfStrs.push_back(i);

   // output results
   for (size_t i = 0; i < vecOfStrs.size(); i++) 
       std::cout << vecOfStrs[i] << "\n" ;
}

Live Example

答案 3 :(得分:0)

这应该有效。它逐行解析文件,匹配所有必需的字符串,然后将它们转换为int,同时将它们添加到std::vector中。

#include <regex>
#include <string>
#include <vector

   int main()
    {
        std::ifstream fileIn("Scores.txt")
        std::string str;
        std::regex words_regex("[^, ]+");
        std::vector<int> vecOfStrs();

        while (std::getline(fileIn, str)) 
         {
            if (str.size() > 0) 
           {
              auto words_begin = std::sregex_iterator(s.begin(), s.end(), words_regex);
              auto words_end = std::sregex_iterator() 
              for (std::sregex_iterator i = words_begin; i != words_end; ++i)                             
                 vecOfStrs.emplace_back(std::stoi(*i.str())); 

           }   
       }

    }