Использование ввода php: // может помочь, но для меня это не сработало, вот что:
Если эти два проверки не решают вашу проблему, а затем, чтобы узнать, что такое данные, вы должны выполнить эхо или распечатать свои данные до, а затем после декодирования, чтобы узнать, как данные получены и обработаны.
Для простых задач в среде Unix-ish попробуйте popen()
.
На странице man:
Функция popen () открывает процесс, создавая канал, разворачивая и вызывая оболочку.
Если вы используете режим чтения, это именно то, о чем вы просили. Я не знаю, реализована ли она в Windows.
Для более сложных проблем вы хотите искать межпроцессное общение.
popen поддерживается в Windows, см. здесь:
http://msdn.microsoft.com/en-us/library/96ayss4b.aspx
Если вы хотите, чтобы это была кросс-платформенная, поп-это путь.
Документация MSDN. Если используется в программе Windows, функция _popen возвращает недопустимый указатель файла, который заставляет программу перестать отвечать на неопределенное время. _popen работает правильно в консольном приложении. Чтобы создать приложение Windows, которое перенаправляет ввод и вывод, см. «Создание дочернего процесса с перенаправленными входами и выходами в SDK Windows».
В Linux и OS X popen()
на самом деле это ваш лучший выбор, как отметил dmckee, поскольку обе ОС поддерживают этот вызов. В Windows это должно помочь: http://msdn.microsoft.com/en-us/library/ms682499.aspx
Ну, предположим, что вы находитесь в командной строке в среде Windows, вы можете использовать переадресацию труб или команд. Например,
commandThatOutputs.exe > someFileToStoreResults.txt
или
commandThatOutputs.exe | yourProgramToProcessInput.exe
В вашей программе вы могли бы использовать стандартные функции ввода C для чтения других программ (scanf и т. Д.): http://irc.essex.ac.uk/www.iota-six.co.uk/c/c1_standard_input_and_output.asp . Вы также можете использовать пример файла и использовать fscanf. Это также должно работать в Unix / Linux.
Это очень общий вопрос, вы можете включить более подробную информацию, например, какой тип вывода (просто текст или двоичный файл?) И как вы хотите обработать его.
Edit: Hooray clarification!
Перенаправление STDOUT выглядит бесполезным, мне приходилось делать это в .NET, и это давало мне все виды головные боли. Похоже, что правильный способ C - это порождать дочерний процесс, получить указатель на файл, и внезапно у меня болит голова.
Таким образом, это взломать, который использует временные файлы. Это просто, но это должно сработать. Это будет хорошо работать, если скорость не является проблемой (удар по диску медленный) или если он выбрасывается. Если вы строите корпоративную программу, просмотр перенаправления STDOUT, вероятно, лучше всего, используя то, что рекомендовали другие.
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
FILE * fptr; // file holder
char c; // char buffer
system("dir >> temp.txt"); // call dir and put it's contents in a temp using redirects.
fptr = fopen("temp.txt", "r"); // open said file for reading.
// oh, and check for fptr being NULL.
while(1){
c = fgetc(fptr);
if(c!= EOF)
printf("%c", c); // do what you need to.
else
break; // exit when you hit the end of the file.
}
fclose(fptr); // don't call this is fptr is NULL.
remove("temp.txt"); // clean up
getchar(); // stop so I can see if it worked.
}
Обязательно проверьте права на доступ к файлам: прямо сейчас это просто выкинет файл в том же каталоге, что и exe. Возможно, вы захотите изучить /tmp
в nix или C:\Users\username\Local Settings\Temp
в Vista или C:\Documents and Settings\username\Local Settings\Temp in 2K/XP
. Я думаю, что /tmp
будет работать в OSX, но я никогда не использовал его.
//execute external process and read exactly binary or text output
//can read image from Zip file for example
string run(const char* cmd){
FILE* pipe = popen(cmd, "r");
if (!pipe) return "ERROR";
char buffer[262144];
string data;
string result;
int dist=0;
int size;
//TIME_START
while(!feof(pipe)) {
size=(int)fread(buffer,1,262144, pipe); //cout<<buffer<<" size="<<size<<endl;
data.resize(data.size()+size);
memcpy(&data[dist],buffer,size);
dist+=size;
}
//TIME_PRINT_
pclose(pipe);
return data;
}
Вы можете использовать system()
, как в:
system("ls song > song.txt");
, где ls
- это имя команды для перечисления содержимого песни в папке, а song
- это папка в текущем каталоге. Результирующий файл song.txt
будет создан в текущем каталоге.
Как указывали другие, popen()
является наиболее стандартным способом. И поскольку ни один из ответов не предоставил пример с использованием этого метода, вот он:
#include <stdio.h>
#define BUFSIZE 128
int parse_output(void) {
char *cmd = "ls -l";
char buf[BUFSIZE];
FILE *fp;
if ((fp = popen(cmd, "r")) == NULL) {
printf("Error opening pipe!\n");
return -1;
}
while (fgets(buf, BUFSIZE, fp) != NULL) {
// Do whatever you want here...
printf("OUTPUT: %s", buf);
}
if(pclose(fp)) {
printf("Command not found or exited with error status\n");
return -1;
}
return 0;
}
pclose()
return -1
, если произошла ошибка получения статуса выхода команды, в противном случае она возвращает статус выхода. Поскольку команды традиционно устанавливают статус выхода 0
для указания успеха, проверяя if(pclose(fp))
, мы тестируем ошибки как в pclose()
, так и в команде.
– MestreLion
31 March 2016 в 22:48
popen()
были бы хороши. – Alexej Magura 29 July 2013 в 20:29popen
привязывает вас к указателю файла, очень похожим наfopen
. Просто он позволяет вам записываться на стандартный ввод или читать со стандартного вывода программы, а не взаимодействовать с файлом диска. Это философия unix & quot; все является файлом & quot; i> на работе. Некоторые реализации расширяют стандарт, позволяя двунаправленную связь. – dmckee 30 July 2013 в 02:09popen
доступен в Windows. – Jonathon Reinhart 25 June 2015 в 19:17