2017-02-14 21 views
-1

ここでは、ファイル内の行と文字の数を数えるコードを得ました。次に、複数のファイルに対して同じことを実装する必要があります。基本的に私のコードは、各ファイルのchars単語と行の数を読み取る必要があります(chars単語と行の数を各ファイルから追加するchars単語と行の合計を生成する必要があります。私はまた、 、ファイルが見つからない、認識できない引数があります。これは私のコードですが、コンパイルしようとしましたが、各ファイルのcharsの単語と文字数を読み込み、total.Thankを追加しませんでした。大幅理解や提案する。2つのファイルの文字と行の総数を数えて合計して合計を計算するにはどうすればよいですか?

#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

ようこそスタックオーバーフロー。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

+2

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+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(); 
    } 
} 
// ----------------------------------------------------------------------------- 
+0

あなたのコードは '{}'の大括弧で囲まれたレベルが多すぎます。コードを読みにくくします。 –

+0

ああ、ああ、大変おかげさまで、大括弧を外してくれてありがとう。あなたの最高。 –

関連する問題