средствами с++ нужно выполнить команду в "командной строке" и получить её результат. как? перенаправление в файл не предлагать.
man popen Code: #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char path[256]; fp = popen("ls", "r"); while (fgets(path, 256, fp) != NULL) { printf("%s", path); } pclose(fp); return 0; }
CreateProcess и CreatePipe А лучше google + непривязываться к языкам програмирования. Потому как API оно и в африке абгдырдыщ. В Delphi World есть парочку исходников на эту тему: "Как захватить весь вывод в консоли" "Запустить консольное приложение и получить его стандартный вывод" "CreateProcess, который возвращает консольный вывод" Там оснавная часть кода написана на API по этому переписать на Си не составит труда.
А если не полениться и заглянуть в World C++ то там есть тоже 2 статьи с исходниками на С++ "Использование anonymous pipes для перехвата StdIn/StdOut дочернего процесса." "Создание дочернего процесса с переназначенным вводом и выводом" Ответы на большую половины вопрос можно сразу найти в Delphi World и World C++ Не по ленитесь и скачайте это всё добро с netcode.ru
С каких это пор винда является POSIX совместимой? popen() ф-ция НЕ из стандартной библиотеки а является сис. вызовом POSIX систем. Насколько я знаю в винде есть _popen() которая аналогична popen() _http://msdn.microsoft.com/en-us/library/96ayss4b%28VS.80%29.aspx
>С каких это пор винда является POSIX совместимой? С давних, POSIX подсистема Windows NT является совместимой с POSIX.1. А вот насчет popen, да, если компилить через вижал то придется писать _popen (в mingw можно и просто popen)
Сам переведешь или помочь? ) Кстати Interix такая же хрень как wine в linux, так что можно смело заявлять что linux совместима с виндой? Имеется ввиду native совместимость )
мде, а Windows NT 5.1 по твоему не XP? XP входит в семейство вин осей NT, также как и виста и вин сервер и тд. Перед тем как что то заявлять, лучше бы сначала внимательно почитать ) П.С. кстати в постах товарища __mad'a нечего и близко не написано про версии из этого вытекает что можно судить о любой ОС из этого семейства.
> пруфлинк? погуглил, и что то нечего внятного не нашел. Возможно я и ошибся в своем утверждение, но вот то что для большинства (если не для всех) POSIX функций, есть аналоги в стандартной библиотеки (crt, stl) это факт. Да и к тому же проблема mr.The решена, так что считаю что вопрос исчерпан. ps: Хотя да, POSIX совместимость гарантирует, то, что приложение без перекомпиляции будет работать под _всеми_ POSIX совместимыми системами.
холивар детектед. способ __mad'а замечательно работает под виндой, компилятор mingw gcc. всем спасибо. осталось только _ttps://forum.antichat.ru/showpost.php?p=1424458&postcount=3402
Доброе время суток. Возникла проблема: не пишет в конец массива diceArray. Даже не знаю в чем проблема. Ошибка в процедуре initArray в последней комбинации(6,6,6,6,6,6). Code: #include <algorithm> #include <fstream> #include <cstdlib> #include <vector> #include <iostream> using namespace std; void initArray(int **array); // заполнение массива нужными числами bool isEnd(int *array, const int size);// признак окончания заполнения void normalize(int *array, const int size);// проверка вхождения в диапозон void calculateSums(int **array, const int xSize, const int ySize);// подсчет общего количества сумм int currentSum(int *array, const int xSize);// сумма строки //----main() int main(int argc, char *argv[]) { const int ySize = 6 * 6 * 6 * 6 * 6 * 6; // количество вариантов const int xSize = 6; // всего кубиков int **diceArray = new int*[ySize]; for (int i = 0;i < ySize;++i) diceArray[i] = new int[xSize]; initArray(diceArray); calculateSums(diceArray, xSize, ySize); for (int i = 0;i < ySize;++i) delete []diceArray[i]; delete []diceArray; diceArray = NULL; system("pause"); return 0; } //----initArray() void initArray(int **array) { int combination[6] = {1,1,1,1,1,1}; for (int i = 0;!isEnd(combination, 6);i++) { copy(combination, combination+6, array[i]); combination[5]++; normalize(combination, 6); } } //----isEnd() bool isEnd(int *array, const int size) { if (count(array, array+size, 6) == 6) return true; else return false; } //----normalize() void normalize(int *array, const int size) { for (int i = size - 1;i >= 0;i--) { if (array[i] == 7) { array[i] = 1; array[i-1]++; } } } //----calculateSums() void calculateSums(int **array, const int xSize, const int ySize) { vector<int> sums; int current; int counter = 0; fstream file("out.txt", ios_base::out); if (!file) { cout << "shit happened"; exit(1); } for (int i = 0;i < ySize;++i) { current = currentSum(array[i], xSize); for (int j = 0;j < ySize;++j) if (current == currentSum(array[j], xSize)) counter++; sums.push_back(counter); for (int k = 0;k < xSize;++k) { file << array[i][k]; } file << ":" << counter << endl; counter = 0; } vector<int>::iterator iter = max_element(sums.begin(), sums.end()); file << "\n\nHighest combination is => "; file << *iter; file.close(); } int currentSum(int *array, int xSize) { int current = 0; for (int i = 0;i < xSize;++i) current += array[i]; return current; }
Нет все таки не разобрался. С помощью какого метода можно получить список открытых окон? ИМенно окон а не процессов!
Классы... компоненты... - недоверяю. WinAPI и тока ВыньАпи Code: #include <windows.h> #include <tlhelp32.h> #include <stdio.h> int main(int argc, char* argv[]) { HANDLE hSnap; PROCESSENTRY32 proc; hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (!hSnap) { printf("ERROR"); } else { if (Process32First(hSnap, &proc)) { printf("%s\n", proc.szExeFile); while (Process32Next(hSnap, &proc)) { printf("PID: %i\t NAME: %s\n",proc.th32ProcessID, proc.szExeFile); } } } return 0; }
Здравствуйте У меня возник вопрос, каким образом на C организовать быстрое удаление строки из файла ?, ну как это например сделано во многих брутах(очищение source файла), веть перезаписывать каждый раз файл(а он может достигать внушительных размеров) не есть гуд.