0

我应该从包含多个(21578)文本文件的文件夹中读取(扫描)数据,文件名从 1 到 21578 编号,并读取文本文件中出现的每个单词,并计算它出现的次数整个文件夹,即;在所有文件中我该怎么做?请帮忙。

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;

    void main ()
    {
    string STRING;
ifstream infile;
for(int i=0;i<21578;i++)
    {


infile.open (i+".txt");
    while(!infile.eof) // To get you all the lines.
    {
        getline(infile,STRING); // Saves the line in STRING.
        cout<<STRING; // Prints our STRING.
    }
infile.close();
system ("pause");
    }
    }
4

2 回答 2

4

最简单的方法是创建一个字符串到整数的映射。

std::map<std::string, int>

然后增加包含的 int,或者如果它不存在则添加到地图中。

http://www.cplusplus.com/reference/map/map/

如果您使用的是 c++11(我认为)或更高版本,您甚至可以使用 unordered_map,它不是使用排序来访问元素,而是使用散列。如果性能很重要,这是您可以研究的优化。

这里有一些示例代码可以帮助您入门

#include <iostream>
#include <map>
#include <string>
using namespace std;

void incrementString(map<string, int> &theMap, string &theString) {
    if(theMap.count(theString)) {
        theMap[theString]++;
    } else {
        theMap[theString] = 1;//This fixes the issue the other poster mentioned, though on most systems is not necessary, and this function would not need an if/else block at all.
    }
}

void printMap(map<string, int> &theMap) {
    map<string, int>::iterator it = theMap.begin();

    do {
        cout << it->first << ": " << it->second << endl;
    } while(++it != theMap.end());

}

int main() {
    map<string, int> stringMap;

    string hi = "hi";//Assigning "hi" to a string, like like cin>>string would.
    string the = "the";

    incrementString(stringMap, hi);//Adding one occurance of hi to the map

    incrementString(stringMap, the);//Adding one occurance of the to the map

    incrementString(stringMap, hi);//Adding another occurance of hi to the map

    printMap(stringMap); //Printing the map so far
}

int main_alt() {
    map<string, int> stringMap;

    string someString;

    while(cin>>someString) {//reads string from std::cin, I recommend using this instead of getline()
        incrementString(stringMap, someString);
    }

    printMap(stringMap);
}

因此,预期的输出是:

hi: 2
the: 1

此外,如果你启用“main_alt()”,你可以像这样调用你的程序,看看 while(cin>>string) 行是如何工作的。

./program < someFile.txt
于 2013-06-07T13:41:43.920 回答
0

在读取目录中的所有文件时,最好使用操作系统工具而不是假设文件名是什么(除非或多或少有保证。)所以,我建议在符合 POSIX 的情况下使用opendirreaddirWindows 中的系统和类似设施。

现在,在计算出现次数时,您自然会采用std::map<string, int>以下方式:

// collect

for (all files) {
    open fin;

    while (fin >> str)
        mymap[str]++;   // will create an entry if not here with a default value of 0

}

// print counts

for (map<string,int>::iterator it = m.begin(); it != m.end(); ++it)
    cout << it->first << "  :  " << it->second << std::endl;
于 2013-06-07T13:49:46.943 回答