Как ввести файл в C ++ и сравнить консольный ввод

Я работаю над своим домашним заданием, и я застрял, потому что в этом задании мы должны попросить пользователя ввести имя файла, а также ввести 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

}

1

Решение

Вы должны найти пространство между командой и именем файла во входных данных пользователя, а затем разбить строку, где вы найдете пространство. Что-то вроде этого

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);

Это непроверенный код.

Вы могли бы сделать лучше, чем это, например, это не будет работать, если пользователь ввел два пробела между командой и именем файла. Но такая работа быстро становится очень утомительной. Поскольку это задание, у меня будет соблазн перейти к более интересным вещам. Вы всегда можете вернуться и улучшить вещи позже, если у вас есть время.

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

Примечание: конкретные тесты валидности здесь слишком упрощены.

0

По вопросам рекламы [email protected]