Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;用空格和逗号分隔字符串_C++_File_Vector_File Io - Fatal编程技术网

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

C++ C++;用空格和逗号分隔字符串,c++,file,vector,file-io,C++,File,Vector,File Io,我试图读取一个文本文件,用逗号和空格“,”分隔整数值,并将每个单独的整数(不包括“)添加到整数向量中。以下代码仅打印第一个值。我做错了什么 #include <iostream> #include <fstream> #include <string> #include <vector> #include <sstream> using namespace std; int main() { std::vector<int>

我试图读取一个文本文件,用逗号和空格“,”分隔整数值,并将每个单独的整数(不包括“)添加到整数向量中。以下代码仅打印第一个值。我做错了什么

#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;
}

我想如果有人偶然发现了这个问题并寻找答案。使用

if (ss.peek() == ',' || ss.peek() == ' ')
检查它是空白还是逗号而不是

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

我想如果有人偶然发现了这个问题并寻找答案。使用

if (ss.peek() == ',' || ss.peek() == ' ')
检查它是空白还是逗号而不是

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

没有必要求助于
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" ;
}
#包括
#包括
#包括
#包括

#包括

没有必要求助于
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" ;
}
#包括
#包括
#包括
#包括

#包括

这应该有效。它逐行解析文件,匹配所有必需的字符串,然后将它们转换为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())); 

           }   
       }

    }
#包括
#包括
#包括(0)
{
自动words\u begin=std::sregex\u迭代器(s.begin()、s.end()、words\u regex);
自动单词\u end=std::sregex\u迭代器()
for(std::sregex\u迭代器i=单词\u开始;i!=单词\u结束;++i)
向量定位(std::stoi(*i.str());
}   
}
}

这应该行得通。它逐行解析文件,匹配所有必需的字符串,然后将它们转换为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())); 

           }   
       }

    }
#包括
#包括
#包括(0)
{
自动words\u begin=std::sregex\u迭代器(s.begin()、s.end()、words\u regex);
自动单词\u end=std::sregex\u迭代器()
for(std::sregex\u迭代器i=单词\u开始;i!=单词\u结束;++i)
向量定位(std::stoi(*i.str());
}   
}
}

将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
}
基本上:把它读成一个字符串,然后把你不想要的作为输入

我在你的代码中发现的一个问题是你偷看了2个字符。您应该只查看一个字符(请参见)。我想这就是导致意外行为的原因


干杯

将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
}
基本上:把它读成一个字符串,然后把你不想要的作为输入

我在你的代码中发现的一个问题是你偷看了2个字符。您应该只查看一个字符(请参见)。我想这就是导致意外行为的原因


干杯

旁注:单引号表示一个字符<“代码>”,“
尝试将两个字符填充到一个字符中。其结果有些奇怪。大多数编译器都会发出警告。不要忽视这些警告。它们是防止逻辑错误的第一道防线。您可以只做一个
std::用空格替换所有逗号,然后使用
std::istringstream
,而不使用所有这些
peek
调用。旁注:单引号表示一个字符<“代码>”,“
尝试将两个字符填充到一个字符中。其结果有些奇怪。大多数编译器都会发出警告。不要忽视这些警告。它们是防止逻辑错误的第一道防线。你可以只做一个
std::用空格替换所有逗号,然后使用
std::istringstream
,而不用所有那些
peek
调用。这不是一个完整的解决方案。仅此代码将检测输入流中的空间并忽略它。这使得输入流中的逗号由
ss>>i
拾取,而
ss>>i
无法解析逗号。它需要被包装成一个循环。这不是一个完整的解决方案。仅此代码将检测输入流中的空间并忽略它。这使得输入流中的逗号由
ss>>i
拾取,而
ss>>i
无法解析逗号。它需要被包装成一个循环。