文件词数统计

好久没写代码了。

拿起了我熟悉的C++,参考别人代码的情况下还整了半多小时。

#include <iostream>
#include <cstdio>
#include <fstream>
#include <string>
#include <vector>
#include <map>
#include <cctype>
#include <cstring>
#include <io.h>
using namespace std;
void console_get_name();
void display_map(map<string,int> &wmap);
void file_get_map(string Arg);
void file_txt_get_map(char* A);
void console_get_single();
void file_info_get_map(char* fileinfo);
void one_backslash_become_two_backslash(char* Path);
int main(int argc ,char** argv)
{
    if(argc==1)
        console_get_single();
    if(argc==3)
    {
        string arg=argv[2];
        file_get_map(arg);
    }
    char a[200]="",b[20]="*.txt",c[20]="\\",d[20]="-s";
    if(strcmp(d,argv[1])==0)
    {
        console_get_name();
        return 0;
    }
    char buf[80];
    getcwd(buf,sizeof(buf));
    strcat(a,buf);
    strcat(a,c);
    strcat(a,argv[1]);
    strcat(a,c);
    strcat(a,b);
//printf("%s\n",argv[0]);
    one_backslash_become_two_backslash(a);
// strcat(a,b);
//printf("%s\n",a);
    long Handle;
    struct _finddata_t FileInfo;
    if((Handle=_findfirst(a,&FileInfo))==-1L)
    {
        char aa[200];
        strcpy(aa,argv[1]);
        file_txt_get_map(aa);
    }
    else
    {

        file_info_get_map(FileInfo.name);
        while(_findnext(Handle,&FileInfo)==0)
            file_info_get_map(FileInfo.name);
        _findclose(Handle);
    }

// get_map();

    return 0;
}

void display_map(map<string,int> &wmap)
{
    map<string,int>::const_iterator map_it;
    int tot=0;
    for(map_it=wmap.begin(); map_it != wmap.end(); map_it ++)
        tot++;
    cout<<"total "<<tot<<endl;
    for(map_it=wmap.begin(); map_it != wmap.end(); map_it ++)
    {
        cout << map_it->first <<" "<< map_it->second << endl;
    }


}
void file_txt_get_map(char* A)
{
    string filename;
    filename=A;
//cin.get();
    filename+=".txt";
    ifstream fin(filename.c_str()); // read in str[]
    string temp;
    map<string,int> wmap;
    while(fin>>temp)
    {
        int len=temp.size();
        char tmp[20]="";
        int j=0;
        for(int i=0; i<len; i++)
        {
            if (isalpha(temp[i]))
            {
                tmp[j]=temp[i];
                j++;
            }

        }
        string tmp2(tmp);
        wmap[tmp2]++;
    }
    display_map(wmap);
    fin.close();
    cin.get();
}
void file_get_map(string Arg)
{
    string filename;
    filename=Arg;
// cin.get();
    ifstream fin(filename.c_str()); // read in str[]
    string temp;
    map<string,int> wmap;
    while(fin>>temp)
    {
        int len=temp.size();
        char tmp[20]="";
        int j=0;
        for(int i=0; i<len; i++)
        {
            if (isalpha(temp[i]))
            {
                tmp[j]=temp[i];
                j++;
            }

        }
        string tmp2(tmp);
        wmap[tmp2]++;
    }
    display_map(wmap);
    fin.close();
    cin.get();
}
void console_get_single()
{
    string temp;
    map<string,int> wmap;
    while(cin>>temp)
    {

        int len=temp.size();
        char tmp[20]="";
        int j=0;
        for(int i=0; i<len; i++)
        {
            if (isalpha(temp[i]))
            {
                tmp[j]=temp[i];
                j++;
            }

        }
        string tmp2(tmp);
        wmap[tmp2]++;
        if (getchar()=='\n')
            break;
    }
    display_map(wmap);
    cin.get();
}
void console_get_name()
{
    string filename;
    cin>>filename;
//cin.get();
    filename+=".txt";
    ifstream fin(filename.c_str()); // read in str[]
    string temp;
    map<string,int> wmap;
    while(fin>>temp)
    {
        int len=temp.size();
        char tmp[20]="";
        int j=0;
        for(int i=0; i<len; i++)
        {
            if (isalpha(temp[i]))
            {
                tmp[j]=temp[i];
                j++;
            }

        }
        string tmp2(tmp);
        wmap[tmp2]++;
    }
    display_map(wmap);
    fin.close();
    cin.get();
}
void one_backslash_become_two_backslash(char* Path)
{
    int len=strlen(Path);
    char Path2[100];
    for(int i=0,j=0; i<len; i++)
    {
        if(Path[i]=='\\')
        {
            Path2[j++]='\\';
            Path2[j++]='\\';
        }
        else Path2[j++]=Path[i];
    }
    strcpy(Path2,Path);
}
void file_info_get_map(char* fileinfo)
{
    string filename=fileinfo;
// cin >> filename;
// cin.get();
    ifstream fin(filename.c_str()); // read in str[]
    string temp;
    map<string,int> wmap;
    while(fin>>temp)
    {
        int len=temp.size();
        char tmp[20]="";
        int j=0;
        for(int i=0; i<len; i++)
        {
            if (isalpha(temp[i]))
            {
                tmp[j]=temp[i];
                j++;
            }

        }
        string tmp2(tmp);
        wmap[tmp2]++;
    }
    display_map(wmap);
    fin.close();
// cin.get();
}

 

读入文件用fstream

首先处理单词,使用ispunct,把标点去掉。

然后我们怎么存。因为要统计个数,本能的想到使用map(哈希也是可以的)。(然后去百度了个map的代码改了改)map默认按key升序排序,由于题目没要求所以我没弄成降序。

输出格式控制也懒得弄了。

读入进来然后用迭代器遍历一下就可以输出了。

本地测试成功。

这里五个题算法上基本上就用这个就可以了,输入输出如何控制是接下来的比较重点的问题。

另外我测试的时候是先打开这个wf.exe,然后在里面输入我测试的文件名test.txt。不知道怎样才能实现成wf -s test.txt的效果,还需要再学习一个。

修改了一些代码,可以算total了。

posted @ 2017-09-15 20:25  Gaoyb348  阅读(332)  评论(2编辑  收藏  举报