2015-05-17 2 views
0

Я делаю интерпретатор оболочки, который работает только с вводом клавиатуры, но я должен заставить его работать с текстовыми файлами.Сделать программную работу с вводом и файлом

int main(int argc, char *argv[], char *envp[]) { 
    string comando; 
    mi_argv[0] = NULL; 
    int pid_aux;  
    el_prompt = "$> "; 

    if(argv[1] != NULL) 
    { 
    ifstream input(argv[1]); 
    if (!input) 
    { 
     cerr << "No se reconoce el archivo " << argv[1] << endl; 
     exit(EXIT_FAILURE); 
    } 
    } 

    while(!cin.eof()) 
    { 
    cout << el_prompt; 
    getline(cin, comando); 
    ... 
    } 
} 

Дело в том, чтобы сделать эту работу с файлом как аргумент ./shell file.txt. Я попытался перенаправить файл на cin, но я не знаю, как это сделать.

+0

Возможный дубликат [Как перенаправить cin и cout в файлы?] (Http://stackoverflow.com/questions/10150468/how-to-redirect-cin-and-cout-to-files) –

ответ

1

Поместите код чтения из входного потока на в отдельной функции, и передать ссылку на входной поток в к функции. Затем вы можете передать любой входной поток функции, файл, который вы открыли, или std::cin.

Как, например,

void main_loop(std::istream& input) 
{ 
    // Use `input` here like any other input stream 
} 

Теперь вы можете вызвать функцию либо со стандартным вводом

main_loop(std::cin); 

или файлом

main_loop(input); 

Кроме того, будьте осторожны с этим условием цикла, делая while (!stream.eof()) будет в большинство случаев не работают должным образом. Причина в том, что флаг eofbit не установлен до после, который вы пытаетесь прочитать из-за конца потока, и приведет к тому, что цикл будет выполняться еще одно дополнительное время.

Вместо этого, например, while (std::getline(...)).

+0

Работайте идеально с клавиатура, но когда я использую файл, распечатайте все команды, а затем распечатайте подсказки, возможно, проблему с потоком. Я удаляю приглашение, когда есть файл, но если у вас есть лучшее решение, я буду этому благодарен. Спасибо!. – mbayon

0

Нечто подобное.

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


void usage() { 
    std::cout << "Usage: shell <filename>\n"; 
} 

int main(int argc, char* argv[]) { 
    std::string comando; 
    std::string el_prompt = "$> "; 

    if (argc != 2) { 
     usage(); 
     exit(1); 
    } 

    std::ifstream input(argv[1]); 
    while (std::getline(input, comando)) { 
     std::cout << el_prompt << comando; 
    } 
} 

Вам понадобится код, чтобы проанализировать команду и выполнить ее.

Смежные вопросы