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
无法解析逗号。它需要被包装成一个循环。