[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    средствами с++ нужно выполнить команду в "командной строке" и получить её результат. как? перенаправление в файл не предлагать.
     
  2. __mad

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    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;
    }
    
     
    1 person likes this.
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    CreateProcess и CreatePipe
    А лучше google + непривязываться к языкам програмирования. Потому как API оно и в африке абгдырдыщ.
    В Delphi World есть парочку исходников на эту тему:

    "Как захватить весь вывод в консоли"
    "Запустить консольное приложение и получить его стандартный вывод"
    "CreateProcess, который возвращает консольный вывод"

    Там оснавная часть кода написана на API по этому переписать на Си не составит труда.
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А если не полениться и заглянуть в World C++ то там есть тоже 2 статьи с исходниками на С++

    "Использование anonymous pipes для перехвата StdIn/StdOut дочернего процесса."
    "Создание дочернего процесса с переназначенным вводом и выводом"

    Ответы на большую половины вопрос можно сразу найти в Delphi World и World C++
    Не по ленитесь и скачайте это всё добро с netcode.ru
     
    1 person likes this.
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 __mad То что ты написал - это под пингвины, но судя по всему человеку нужно под Win
     
  6. __mad

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    это POSIX функция, она и под виндой будет работать.
     
  7. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    С каких это пор винда является POSIX совместимой?
    popen() ф-ция НЕ из стандартной библиотеки а является сис. вызовом POSIX систем.
    Насколько я знаю в винде есть _popen() которая аналогична popen() _http://msdn.microsoft.com/en-us/library/96ayss4b%28VS.80%29.aspx
     
  8. __mad

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    >С каких это пор винда является POSIX совместимой?

    С давних, POSIX подсистема Windows NT является совместимой с POSIX.1.

    А вот насчет popen, да, если компилить через вижал то придется писать _popen (в mingw можно и просто popen)
     
  9. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    пруфлинк?
     
  10. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    http://en.wikipedia.org/wiki/Microsoft_POSIX_subsystem
     
    _________________________
  11. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Сам переведешь или помочь? )
    Кстати Interix такая же хрень как wine в linux, так что можно смело заявлять что linux совместима с виндой?
    Имеется ввиду native совместимость )
     
  12. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Так __mad написал про Win NT, а не XP
     
    _________________________
  13. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    мде, а Windows NT 5.1 по твоему не XP?
    XP входит в семейство вин осей NT, также как и виста и вин сервер и тд.
    Перед тем как что то заявлять, лучше бы сначала внимательно почитать )

    П.С. кстати в постах товарища __mad'a нечего и близко не написано про версии из этого вытекает что можно судить о любой ОС из этого семейства.
     
    #3393 razb, 3 Aug 2009
    Last edited: 3 Aug 2009
  14. __mad

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    > пруфлинк?

    погуглил, и что то нечего внятного не нашел. Возможно я и ошибся в своем утверждение, но вот то что для большинства (если не для всех) POSIX функций, есть аналоги в стандартной библиотеки (crt, stl) это факт.

    Да и к тому же проблема mr.The решена, так что считаю что вопрос исчерпан.

    ps: Хотя да, POSIX совместимость гарантирует, то, что приложение без перекомпиляции будет работать под _всеми_ POSIX совместимыми системами.
     
  15. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    холивар детектед. способ __mad'а замечательно работает под виндой, компилятор mingw gcc. всем спасибо.

    осталось только _ttps://forum.antichat.ru/showpost.php?p=1424458&postcount=3402
     
  16. 4p3

    4p3 Elder - Старейшина

    Joined:
    18 Aug 2008
    Messages:
    142
    Likes Received:
    30
    Reputations:
    0
    Доброе время суток.
    Возникла проблема: не пишет в конец массива 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;
    }
     
  17. 4p3

    4p3 Elder - Старейшина

    Joined:
    18 Aug 2008
    Messages:
    142
    Likes Received:
    30
    Reputations:
    0
    use system(const char* command);
     
  18. Antikvazar

    Antikvazar New Member

    Joined:
    22 Mar 2009
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Нет все таки не разобрался. С помощью какого метода можно получить список открытых окон? ИМенно окон а не процессов!
     
    #3398 Antikvazar, 6 Aug 2009
    Last edited: 6 Aug 2009
  19. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Классы... компоненты... - недоверяю.
    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;
    }
    
     
    1 person likes this.
  20. [XAOC]

    [XAOC] New Member

    Joined:
    6 Oct 2008
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Здравствуйте

    У меня возник вопрос, каким образом на C организовать быстрое удаление строки из файла ?, ну как это например сделано во многих брутах(очищение source файла), веть перезаписывать каждый раз файл(а он может достигать внушительных размеров) не есть гуд.
     
    1 person likes this.
Thread Status:
Not open for further replies.