Форум программистов, компьютерный форум CyberForum.ru

Pipe мусор от прогресса загрузки - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Ошибка цикла For http://www.cyberforum.ru/cpp-beginners/thread1748954.html
// Создаем структуру //делаем 10 копий //инициализируем их // выводим на консоль #include "stdafx.h" #include <iostream> using namespace std; struct Person
C++ Логика реализации симметричного бинарного отношения Есть следующее задание для курсовой: Даны исходные данные о сотрудниках IT компании. Даны два бинарных отношения для всех сотрудников. Первое отношение “работал вместе”, второе - “психологически не совместим”. Необходимо сформировать новую команду для нового проекта. Начальник выбирает ответственного за проект (Team Lead) и задает количество сотрудников для проекта. Программа выбирает заданное... http://www.cyberforum.ru/cpp-beginners/thread1748941.html
C++ Чтение из файла массива структур
/* 4. Дана информация о семи студентах. Структура имеет вид: фамилия, имя, отчество и 4 оценки за экзамены. Вывести данные о студентах, сдавших сессию на отлично. Проблема такая : не выводятся данные из файла...прошу помощи. Заранее спасибо !!! */ #pragma once #include <iostream> #include <string> #include <fstream>
C++ Повторное открытие файла
пишу очередную учебную программу, и возник вопрос вопросов. я открываю текстовый файл откуда построчно читаю фалы и считаю строки в которых встречается "wire" по кол-ву таких строк выделяю память в динамическом массиве и готовлюсь снова открыть файл и произвести запись в массив структур. проблема во втором открытие файла. компилируется все ок, но не срабатывает что то. #include <iostream>...
C++ Построение бинарных деревьев для сложных величин http://www.cyberforum.ru/cpp-beginners/thread1748881.html
Добрый день нужна помощь в написании программы для построение бинарных деревьев для слож. велечин. Я перелопатил интернет но что то толкового я не нашел. Нужно построить по формуле a+(b-c)*d^e+f. Я слаб в этой теме и не смог понять как правильно. Зарание спасибо.
C++ Добавить различные смещения от начала строки Имеется прога, представляющая работу текстового редактора на иерархическом списке. Требуется сделать так, чтобы при чтении из файла и при добавлении новой записи был отступ от начала строки в соответствии с принадлежностью тому или иному подпункту/пункту. Не знаю, как сделать лучше, прошу помочь с вариантами, заранее спасибо. //Stack.h - класс стека #pragma once #include "stdafx.h" ... подробнее

Показать сообщение отдельно
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
29.05.2016, 20:37     Pipe мусор от прогресса загрузки
Пробрасываю curl, при загрузке страницы он пишет в консоль прогресс. Весь этот прогресс внутри консоли выглядит вполне прилично, обновляются таймеры, если сделать перенаправление вывода в файл, то файл получит чистый результат работы curl. Однако при перенаправлении с помощью pipe столкнулся со следующей проблемой:
1) Прогресс загрузки постоянно дописывается и получается вот такой хлам:
Bash
1
2
3
4
5
6
7
8
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current 
                                 Dload  Upload   Total   Spent    Left  Speed   
    
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0  
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0  
  0     0    0     0    0     0      0      0 --:--:--  0:00:03 --:--:--     0  
  0     0    0     0    0     0      0      0 --:--:--  0:00:04 --:--:--     0  
  0 21116    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0
2) Ошметок этого прогресса почему-то записывается в середину результата работы, причем на 800+ строке:
Bash
1
2
3
4
5
6
  <uid>123123</uid> 
  <uid>123123</uid> 
  <uid>123123</ 
100 21116  100 21116    0     0   3867      0  0:00:05  0:00:05 --:--:--  3867uid>  
  <uid>123123</uid> 
  <uid>123123</uid>
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Запуск приложения и получение ответа.
std::string result = "";
extern "C" __declspec(dllexport) void __stdcall RunAndGet(tParamStruct *ParamStruct)
{
    result = ""; // Очищаем возможных предыдущих вызовов.
    HANDLE hPipeRead, hPipeWrite;
 
    SECURITY_ATTRIBUTES saAttr = { sizeof(SECURITY_ATTRIBUTES) };
    saAttr.bInheritHandle = TRUE;   //Pipe handles are inherited by child process.
    saAttr.lpSecurityDescriptor = NULL;
 
    // Create a pipe to get results from child's stdout.
    if (!CreatePipe(&hPipeRead, &hPipeWrite, &saAttr, 0)){
        result = "plugin_error_1";
        ResultStruct.RArray = &result[0];
        ResultStruct.RLength = result.size();
        ResultStruct.used = true;
        ParamStruct->pResultStruct = &ResultStruct;
        return;
    }
 
    STARTUPINFOA si = { sizeof(STARTUPINFOA) };
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    si.hStdOutput = hPipeWrite;
    si.hStdError = hPipeWrite;
    si.wShowWindow = SW_HIDE;       // Prevents cmd window from flashing. Requires STARTF_USESHOWWINDOW in dwFlags.
 
    PROCESS_INFORMATION pi = { 0 };
 
    BOOL fSuccess = CreateProcessA(NULL, (LPSTR)ParamStruct->ParamString, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
    if (!fSuccess)
    {
        CloseHandle(hPipeWrite);
        CloseHandle(hPipeRead);
        result = "plugin_error_2: \r\n";
        result.append(ParamStruct->ParamString);
        ResultStruct.RArray = &result[0];
        ResultStruct.RLength = result.size();
        ResultStruct.used = true;
        ParamStruct->pResultStruct = &ResultStruct;
        return;
    }
 
 
    bool bProcessEnded = false;
    for (; !bProcessEnded;)
    {
        // Give some timeslice (50ms), so we won't waste 100% cpu.
        bProcessEnded = WaitForSingleObject(pi.hProcess, 1) == WAIT_OBJECT_0;
 
        // Even if process exited - we continue reading, if there is some data available over pipe.
        for (;;)
        {
            char buf[1024];
            DWORD dwRead = 0;
            DWORD dwAvail = 0;
 
            if (!::PeekNamedPipe(hPipeRead, NULL, 0, NULL, &dwAvail, NULL))
                break;
 
            if (!dwAvail) // no data available, return
                break;
 
            if (!::ReadFile(hPipeRead, buf, min(sizeof(buf) - 1, dwAvail), &dwRead, NULL) || !dwRead)
                // error, the child process might ended
                break;
 
            buf[dwRead] = 0;
            result += buf;
        }
    } //for
 
 
    CloseHandle(hPipeWrite);
    CloseHandle(hPipeRead);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
 
//  Конвертируем текст 866->1251.
 
 
    for (char *c = (char*)result.c_str(); *c != 0; ++c) {
            if (*c > -129 && *c<-80)
                *c += 64;
            else if (*c>-33 && *c < -16)
                *c += 16;
        }
 
 
    ResultStruct.RArray = &result[0];
    ResultStruct.RLength = result.size();
    ResultStruct.used = true;
    ParamStruct->pResultStruct = &ResultStruct;
}
Основной вопрос: как разделить эти два вывода, чтобы не получалась каша?
Так же несколько непонятно каким образом cmd позволяет обновлять данные в то время, как в pipe падает весь хлам. В хексе ничего похожего на управляющие символы не нашел.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 08:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru