C ++:计数功能仅计算第一行

时间:2013-06-13 16:56:19

标签: c++

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

3 个答案:

答案 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,因此您不需要第二个参数。