3

ベクトル内の単語をカウントしようとすると問題が発生します。ベクトルは、ファイルのすべての行をオブジェクトとして保持します。v[0] は 1 行目、v[1] は 2 行目などです。

私の 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 の答えの代わりに、これも機能します。文字列ストリーム スコープを 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、2番目の引数が必要ないように使用できます。

于 2013-06-13T17:01:08.430 に答える