C++: запись в файл (как быть с результатом выполнения команды?)

Модератор: Модераторы разделов

Аватара пользователя
ArkanJR
Сообщения: 1170
Статус: Профан

C++: запись в файл

Сообщение ArkanJR »

При демонстрации записи в файл обычно приводится пример, в котором показывается, как поместить в него (в файл) какое-либо слово. Что-то типа такого:

Код: Выделить всё

#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <iomanip>
using namespace std;
int main()
{
ofstream out("text", ios::out | ios::app);
out << "word" << endl;
out.close();
}


А есть ли возможность записать в файл результат выполнения команды, например, ls?
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C++: запись в файл

Сообщение drBatty »

ArkanJR писал(а):
23.10.2014 17:57
А есть ли возможность записать в файл результат выполнения команды, например, ls?

теоретически можно выполнить команды с помощью system(3). На практике это ОЧЕНЬ плохая идея. Это вам не пхп, тут мешать не нужно. Пишите на C++, есть ведь способы прочитать каталог.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1170
Статус: Профан

Re: C++: запись в файл

Сообщение ArkanJR »

drBatty писал(а):
23.10.2014 18:27
теоретически можно выполнить команды с помощью system(3).

Решил проверить, что получится на практике:

Код: Выделить всё

#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <iomanip>
using namespace std;
int main()
{
ofstream out("text", ios::out | ios::app);
out << system("ls");
out.close();
}

В результате запуска полученного бинарика, открылось окно xterm, в котором был перечень имеющихся в каталоге файлов, в созданном файле "text" имелся только 0 (ноль) и больше ничего.
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
IMB
Сообщения: 2563
ОС: Debian

Re: C++: запись в файл

Сообщение IMB »

Код: Выделить всё

$ man system
.................
RETURN VALUE
       The value returned is -1 on  error  (e.g.,  fork(2)  failed),  and  the
       return  status  of the command otherwise.  This latter return status is
       in the format specified in wait(2).  Thus, the exit code of the command
       will  be  WEXITSTATUS(status).   In case /bin/sh could not be executed,
       the exit status will be that of a command that does exit(127).

       If the value of command is NULL, system() returns nonzero if the  shell
       is available, and zero if not.

       system() does not affect the wait status of any other children.

Если Вы хотите запивать вывод команды, то обратите внимание на popen.

Код: Выделить всё

man popen
...............
. FILE *popen(const char *command, const char *type);
................
DESCRIPTION
       The popen() function opens a process by creating a pipe,  forking,  and
       invoking  the shell.  Since a pipe is by definition unidirectional, the
       type argument may specify  only  reading  or  writing,  not  both;  the
       resulting stream is correspondingly read-only or write-only.

       The  command argument is a pointer to a null-terminated string contain‐
       ing a shell command line.  This command is passed to /bin/sh using  the
       -c  flag;  interpretation, if any, is performed by the shell.  The type
       argument is a pointer to a null-terminated string  which  must  contain
       either the letter 'r' for reading or the letter 'w' for writing.  Since
       glibc 2.9, this argument can additionally include the letter 'e', which
       causes  the close-on-exec flag (FD_CLOEXEC) to be set on the underlying
       file descriptor; see the description of the O_CLOEXEC flag  in  open(2)
       for reasons why this may be useful.

       The  return  value  from popen() is a normal standard I/O stream in all
       respects save  that  it  must  be  closed  with  pclose()  rather  than
       fclose(3).   Writing  to  such a stream writes to the standard input of
       the command; the command's standard output is the same as that  of  the
       process  that  called  popen(),  unless  this is altered by the command
       itself.  Conversely, reading from a "popened"  stream  reads  the  com‐
       mand's standard output, and the command's standard input is the same as
       that of the process that called popen().


Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C++: запись в файл

Сообщение drBatty »

ArkanJR писал(а):
23.10.2014 20:00
в созданном файле "text" имелся только 0 (ноль) и больше ничего.

0 значит
"всё хорошо".

А что вам не понравилось?

PS:
хотите в файл, ну и напишите

Код: Выделить всё

system("ls>out");

что не так? Не C++? Дык и ls тоже не C++.

IMB писал(а):
23.10.2014 21:56
Если Вы хотите запивать вывод команды, то обратите внимание на popen.

ну вот, сейчас насоветуют…
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20977
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: C++: запись в файл

Сообщение Bizdelnick »

Spoiler
IMB писал(а):
23.10.2014 21:56
Если Вы хотите запивать вывод команды

Закусывать, закусывать надо!
Извините, не удержался.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1170
Статус: Профан

Re: C++: запись в файл

Сообщение ArkanJR »

drBatty писал(а):
24.10.2014 10:47
ArkanJR писал(а):
23.10.2014 20:00
в созданном файле "text" имелся только 0 (ноль) и больше ничего.

0 значит
"всё хорошо".

А что вам не понравилось?

PS:
хотите в файл, ну и напишите

Код: Выделить всё

system("ls>out");

что не так? Не C++? Дык и ls тоже не C++.

Хотелось бы содержимое каталога, а не ноль (хоть 0 значит "всё хорошо"). :)
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Аватара пользователя
ArkanJR
Сообщения: 1170
Статус: Профан

Re: C++: запись в файл

Сообщение ArkanJR »

drBatty писал(а):
24.10.2014 10:47
PS:
хотите в файл, ну и напишите

Код: Выделить всё

system("ls>out");

А если команд несколько, можно как-то осуществить, чтобы последующая запись не уничтожала предыдущую? Например,

Код: Выделить всё

system("ls>out");
system("uname -a>out");
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C++: запись в файл

Сообщение drBatty »

ArkanJR писал(а):
24.10.2014 19:44
Хотелось бы содержимое каталога,

раз вы пишете на STL, то гуглите "как прочитать каталог STL".

ArkanJR писал(а):
25.10.2014 10:00
А если команд несколько, можно как-то осуществить, чтобы последующая запись не уничтожала предыдущую? Например,

man bash

$

ls>>out

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: