3

我在尝试计算向量内的单词时遇到问题。向量将文件中的每一行作为对象保存。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;
}
4

3 回答 3

6

作为 RichieHindle 的答案的替代方案,这也适用。只需将 stringstream 范围设置为 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;
}
于 2013-06-13T17:01:01.297 回答
4

在重用 stringstream 之前,你必须做

 ss.clear();

在你的while循环之后。

您也可以在for()循环内声明它,但随后它将再次重新初始化。为了可读性,这可能会更好。在性能方面,它可能会有所作为。

于 2013-06-13T17:01:47.587 回答
1

我敢打赌ss,当您第一次用尽它时会进入错误状态,并且不会因为您调用str.

在 for 循环中声明ss并将字符串直接传递给构造函数。这避免了此类问题。

通常,您有一个坏习惯,即在一堆声明变量而不是最接近您需要它们的位置,并且不使用构造函数。例如,您可以将文件名传递给fstream的构造函数,而不是调用open. 你可以使用ifstream所以你不需要第二个参数。

于 2013-06-13T17:01:08.430 回答