我试图读取一个文本文件,用逗号和空格“,”分隔整数值,并将除“,”之外的每个单独的整数添加到整数向量中。以下代码仅显示第一个值。我在做什么错了?
#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
答案 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" ;
}
答案 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()));
}
}
}