1

私は宿題に取り組んでいますが、課題ではユーザーにファイル名を入力するように要求するだけでなく、wc cc または lc (ファイルの単語数、文字数、および行数) を入力するように求める必要があるため、行き詰まりました。たとえば、 、 wc filename.txt.ファイルをチェックして、そのファイルが有効かどうかを確認することを想定していますが、ユーザーの入力を比較して実行するさまざまな種類の関数を決定する方法は知っていますが、どのように実行できるかわかりません何かアイデアはありますか? これは私がこれまでに持っているものです。

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

using namespace std;

int main()
{
string line;
string file;

ifstream input; //input file stream
int i;

cout << "Enter a file name" << endl;

while(true){

    cout << ">" ;
    getline(cin,file);

    input.open(file.c_str());

     if (input.fail()) {
        cerr << "ERROR: Failed to open file " << file << endl;
        input.clear();
     }
     else {
        i = 0;
        while (getline(input, line))

            if(line == "wc"){

            cout << "The word count is: " << endl;
    }
        else if(line == "cc"){

            cout << "The character count is: " << endl;
    }
        else if(line == "lc"){

            cout << "The line count is: " << endl;
    }
        else if(line == "exit"){

            return 0;
    }
        else{

            cout << "----NOTE----" << endl;
            cout << "Available Commands: " << endl;
            cout <<"lc \"filename\"" << endl;
            cout <<"cc \"filename\"" << endl;
            cout <<"wc \"filename\"" << endl;
            cout <<"exit" << endl;
    }



     }



}


return 0;
}

void wordCount(){
   //TBD
}

void characterCount(){
    //TBD

}

void lineCount(){
  //TBD

}
4

2 に答える 2

0

ユーザー入力でコマンドとファイル名の間のスペースを見つけて、スペースが見つかった場所で文字列を分割する必要があります。このようなもの

cout << "Enter a command\n";
string line;
getline(cin, line);
// get the position of the space as an index
size_t space_pos = line.find(' ');
if (space_pos == string::npos)
{
   // user didn't enter a space, so error message and exit
   cout << "illegal command\n";
   exit(1);
}
// split the string at the first space
string cmd = line.substr(0, space_pos);
string file_name = line.substr(space_pos + 1);

これはテストされていないコードです。

たとえば、ユーザーがコマンドとファイル名の間に 2 つのスペースを入力した場合、これは機能しません。しかし、この種の作業は急速に非常に退屈になります。これは課題なので、もっと興味深いことに移りたいと思うでしょう。時間があれば、いつでも戻って改善することができます。

于 2012-09-07T18:53:40.327 に答える
0

コマンドとファイルという複数の引数を検証する方法を尋ねていると思います。

簡単な戦略は、次のような機能を持つことです。

#include <fstream> // Note: this is for ifstream below

bool argumentsInvalid(const string& command, const string & command) {
    // Validate the command
    // Note: Not ideal, just being short for demo
    if("wc" != command && "cc" != command && "lc" != command) {
        std::cout << "Invalid command" << std::endl;
        return false;
    }

    // Validate the file
    // Note: This is a cheat that uses the fact that if its valid, its open.
    std::ifstream fileToRead(filename);
    if(!fileToRead) {
        std::cout << "Invalid file: \"" << filename << "\"" << std::endl;
        return false;
    }

    return true;
    // Note: This does rely on the ifstream destructor closing the file and would mean
    // opening the file twice.  Simple to show here, but not ideal real code.
}

エラーを返す前にすべての引数を評価したい場合は、次のようにその関数の先頭にフラグを挿入します。

// To be set true if there is an error
bool errorFound = false;

条件内のすべての返品を次のように変更します。

errorFound = true;

そして最終的に次の場所に戻ります:

return !errorFound;

使用法:

....

if(argumentsInvalid(command, filename)) {
    std::cout << "Could not perform command.  Skipping..." << std::endl;
    // exit or continue or whatever
}

// Now do your work

注: ここでの特定の有効性テストは単純化されすぎています。

于 2012-09-11T23:39:16.777 に答える