Как записать все входные данные (cin) в файл в C ++ - PullRequest
3 голосов
/ 01 ноября 2011

На самом деле, я работаю над мини-оболочкой. Мои функции работают, но когда я хочу записать весь материал cin (команды, параметры, вывод) в файл, в нем ничего не появляется. Нигде не могу найти что-то для обработки с полным вводом и выводом с параметрами.

Я надеюсь, что кто-то может мне помочь.

Мой код:

using namespace std;

 ofstream outputFile;

void read_command(char *com, char **par){

    fprintf(stdout, "$");
    cin >> com;
    outputFile.open("logging.txt");     // file opened but nothing APPEARS IN IT????

        if(strcmp(com,"date")== 0){             // DATE
          time_t rawtime;
          time ( &rawtime );
          printf ( "%s", ctime (&rawtime) );
         }


        else if(strcmp(com,"echo")== 0)         // ECHO
        {
            string echo_part;
            cin >> echo_part;
            cout << echo_part << endl;

       }

        else if(strcmp(com,"sleep")== 0){           // SLEEP
            int howlong = 0;
            cin >> howlong;
            cout << "seconds: " << howlong << "....zZZzzZzz" << endl;
            sleep(howlong);

        }

        else if(strcmp(com,"ps")== 0)           // PROCESS
        {
            execlp("/bin/ps","ps","-A",NULL);       // ps  - command

        }

}

void handler(int p) {  // CTR-C handler

    cout << endl;
    cout << "Bye !" << endl;
    outputFile.close();
    alarm(1); // 2 seconds alarm ends process with kill
}


int main(){

    int childPid;
    int status;
    char command[20];
    char *parameters[60];
    signal(SIGINT,&handler); // CTR-C exit disabled



    while (1) {

      read_command(command, parameters);

        if ((childPid = fork()) == -1) {
            fprintf(stderr,"can't fork\n");
            exit(1);
        }
        else if (childPid == 0) { //child
            execv(command, parameters);
            exit(0);
        }
        else { // parent process
            wait(&status);
        }
    }
}

Ответы [ 4 ]

1 голос
/ 01 ноября 2011

Вы заново открываете выходной поток outputFile для каждой строки, перезаписывая файл каждой новой командой.

Редактирование: Как отмечали другие авторы, на самом деле не запись чего-либо в outputFile может быть второй причиной.

0 голосов
/ 01 ноября 2011

Ваш код содержит много потенциальных нарушений доступа к памяти.

Существуют библиотеки, которые помогут вам в том, что вы пытаетесь сделать (чтение и интерпретация пользовательского ввода), например, библиотека GNU Readline , которая написана на C (но может использоваться кодом C ++) , как это имеет место для всех написанных на C библиотек). Есть несколько хороших оболочек C ++, таких как, например, SReadlineWrapper .

0 голосов
/ 01 ноября 2011

нет

outputFile << ...;

так что вы не пишете в файл

0 голосов
/ 01 ноября 2011

Вы открываете outputFile, но никогда ничего не пишете в него. Что там должно появиться?

Чтобы вывести что-то в файл, попробуйте

outputFile << something
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...