我在尝试计算向量内的单词时遇到问题。向量将文件中的每一行都保存为对象。 v [0]是第一行,v [1]是第二行,依此类推。
对于我的countWords()函数,它只适用于计数v [0]。过去的任何对象都会被忽略或遗漏。有任何想法吗?提前谢谢。
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int countWords(vector<string> v)
{
stringstream ss;
string word;
int count = 0;
for(int i = 0; i < v.size(); i++) {
ss.str(v[i]);
while (ss >> word)
count++;
}
return count;
}
void readFile(string filename,vector<string> &v)
{
fstream file;
string line;
file.open(filename,ios::in);
while(getline(file,line)) { //Reads the file line by line ...
if(line == "") //... ignoring any empty lines ...
continue;
v.push_back(line); //... and puts them into our vector.
}
file.close();
}
int main(int argc,char* argv[])
{
if (argc != 2) { //Terminate unless the user enters -ONE- entry.
cout << "Usage: " << argv[0] << " <filename>" << endl;
exit(1);
}
string filename = argv[1];
vector<string> fileContents;
readFile(filename,fileContents);
cout << countWords(fileContents) << endl;
}
答案 0 :(得分:6)
作为RichieHindle答案的替代品,这也有效。只需将字符串流范围放在for循环的本地,它就会正确重置。
int countWords(vector<string> v)
{
string word;
int count = 0;
for(int i = 0; i < v.size(); i++) {
stringstream ss(v[i]);
while (ss >> word)
count++;
}
return count;
}
答案 1 :(得分:4)
在重复使用stringstream之前,您必须执行
ss.clear();
在你的while循环之后。
您也可以在for()
循环中声明它,但之后它会再次重新初始化。为了可读性,这可能会更好。从绩效角度来看,它可能会有所作为。
答案 2 :(得分:1)
我敢打赌ss
在您第一次用尽时会进入错误状态,并且因为您拨打str
而无法重置。
在for循环中声明ss
并将字符串直接传递给构造函数。这可以避免这些问题。
一般情况下,你有一个坏习惯,即在一堆中声明变量而不是最接近你需要的变量,而不是使用构造函数。例如,您可以将文件名传递给fstream
的构造函数,而不是调用open
。您可以使用ifstream
,因此您不需要第二个参数。