如何计算两个文件中字符和行的总数,并将它们相加以得出总数?

时间:2017-02-14 03:58:18

标签: c++ command-line-arguments

所以在这里我得到的代码可以计算文件中字符和单词的行数。现在我需要为多个文件实现相同的功能。基本上我的代码应该读取每个文件中的字符和行的数量,并且应该产生总共的字符和行(将每个文件中的字符和行的数量相加。我还需要帮助执行代码形式不良的参数,找不到文件,以及无法识别的参数。这是我的代码,我试着编译它,但它只能读取每个文件中的字符和字符的数量而不是总计。谢谢你们。任何帮助都会非常感谢或建议。

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>




using namespace std;

int main(int argc, char*argv[])
{

if (argc<2){
    cout<<"You did not enter enough arguments, Please try again, close this cd window and enter the correct filename"<<endl;
}
else{
    string filename;
    ifstream thefile;
    int i;
    for(i=1,i<=argc;(i++);){
    filename=argv[i];
    int charactercounter=0, linecounter=1, wordcounter=1, totalLines, totalWords,totalCharacters;
    thefile.open(filename);
        if(!thefile.is_open()){
            cout<<"file does not exist"<<endl;
        }
        else if(thefile.fail()){
            cout<<"arguments can't be recognized"<<endl;
        }

    if(thefile.is_open() && thefile.good()){
    while(!thefile.eof()){
         char ch;
         while(ch!=EOF){
            charactercounter++;
             totalCharacters=totalCharacters+charactercounter;
            if (ch=='\n')
                linecounter++;
                totalLines=totalLines+linecounter;
                if (ch==' ')
                wordcounter++;
                totalWords=totalWords+wordcounter;
            ch=thefile.get();

        }
        }




        cout<<setw(12)<<"Lines"<<' '<< linecounter;
        cout<<' ';
        cout<<setw(12)<<"words"<<' '<< wordcounter;
        cout<<' ';
        cout<<setw(12)<<"characters"<<' '<< charactercounter;
        cout<<' ';
        cout<<setw(12)<<"filename"<<' '<<argv[i];
        cout<<' ';
        cout<<setw(12)<<"totallines"<<' '<<totalLines;
        cout<<' ';
        cout<<setw(12)<<"totalwords"<<' '<<totalWords;
        cout<<' ';
        cout<<setw(12)<<"totalchars"<<' '<<totalCharacters;
        cout<<' ';


        thefile.close();
    }

    }
    }

}

1 个答案:

答案 0 :(得分:0)

添加了一些注释,函数和类,以使代码更易于阅读。

我也尝试保留程序中的错误。

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>

using namespace std;
// -----------------------------------------------------------------------------
bool argc_checker(const int argc, const char* const argv[]) {
    // Check commandline arguments
    // If no problem, return true. Otherwise, return false.
    if (argc < 2) {
        cout << "You did not enter enough arguments, Please try again, "
                "close this cd window and enter the correct filename" << endl;
        return false;
    }
    return true;
}
// -----------------------------------------------------------------------------
bool check_file(const ifstream& thefile) {
    // Return true if the file is ok. Otherwise, return false
    if (!thefile.is_open()) {
        cout << "file does not exist" << endl;
        return false;
    }
    if (thefile.fail()) {
        cout << "arguments can't be recognized" << endl;
        return false;
    }
    if (thefile.is_open() && thefile.good()) {
        return true;
    }
    return false;
}
// -----------------------------------------------------------------------------
class Word_counter {
    // Count the number of character, words, and lines by taking characters
    // one by one.
public:
    Word_counter() { reset(); }
    void take(const char ch) {
        ++_n_chars;
        if (ch == ' ') ++_n_words;
        if (ch == '\n') ++_n_lines;
    }
    void reset() {
        // Reset the word counter.
        _n_chars = 0;
        _n_words = 1;
        _n_lines = 1;
    }
    const int n_chars() const { return _n_chars; }
    const int n_words() const { return _n_words; }
    const int n_lines() const { return _n_lines; }
private:
    int _n_chars;
    int _n_words;
    int _n_lines;
};
// -----------------------------------------------------------------------------
class Total_word_counter {
    // Take a word counter and add its count to total counts.
public:
    Total_word_counter() { reset(); }
    void take(const Word_counter& wc) {
        _n_total_chars += wc.n_chars();
        _n_total_lines += wc.n_lines();
        _n_total_words += wc.n_words();
    }
    void reset() {
        // Reset the total word counter
        _n_total_chars;
        _n_total_lines;
        _n_total_words;
    }
    const int n_total_chars() const { return _n_total_chars; }
    const int n_total_words() const { return _n_total_words; }
    const int n_total_lines() const { return _n_total_lines; }
private:
    int _n_total_chars;
    int _n_total_words;
    int _n_total_lines;
};
// -----------------------------------------------------------------------------
template <typename T>
void simple_print_table(const std::string& name, const T& thing) {
    cout << setw(12) << name << ' ' << thing << ' ';
}
// -----------------------------------------------------------------------------
int main(int argc, char *argv[]) {
    // check if arguments are ok. if not, exit the program.
    if (!argc_checker(argc, argv)) exit(1);

    // Create word counters
    Word_counter wc;
    Total_word_counter total_wc;

    // loop over each commandline argument
    for (int i = 1, i <= argc; (i++); ) {
        string filename(argv[i]);
        ifstream the_file(filename);

        // check if file is ok. if not skip to next cycle of the for loop.
        if (!check_file(the_file)) {
            the_file.close();
            continue;
        }
        // loop over each character of the_file.
        char ch;
        while (!the_file.eof() && (ch != EOF)) {
            wc.take(ch);
            ch = the_file.get(); // pass each char to the word counter
        }
        total_wc.take(wc); // add result of word counter to total_wc
        // Print result of counting
        simple_print_table("Lines", wc.n_lines());
        simple_print_table("words", wc.n_words());
        simple_print_table("characters", wc.n_chars());
        simple_print_table("totallines", total_wc.n_total_lines());
        simple_print_table("totalwords", total_wc.n_total_words());
        simple_print_table("totalchars", total_wc.n_total_chars());
        // Rest word counter
        wc.reset(); // reset the wc so it is ready to count next file
        // Close the file
        the_file.close();
    }
}
// -----------------------------------------------------------------------------