我正在完成我的家庭作业,因为在作业中我们必须要求用户输入文件名,而且还要键入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
}
答案 0 :(得分: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);
这是未经测试的代码。
你可以做得比这更好,例如,如果用户在命令和文件名之间输入两个空格,这将不起作用。但这种工作很快变得非常繁琐。由于这是一项任务,我很想转向更有趣的事情。如果你有时间,你可以随时回来改善事情。
答案 1 :(得分: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
注意:此处的特定有效性测试已经过度简化。