Printable Version of Topic
Click here to view this topic in its original format
Forums > Глюкодром > страдания по c++


Posted by: Lexus on 19-03-2013, 15:16
У нас есть здесь спецы в c++?
Я тут начал работать ;) По профессии я математик, но програмировать надо больше чем считать. Пока проект не начался, я хотел немножко подготовиться. задача стоит простая:

считать с определённой директории список файлом и записать его в array/list

делал так, но ничего не выдаёт:

CODE

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <wtypes.h>
#include <string>

using namespace std;

bool FileExists(const TCHAR *fileName);
bool dirExists(const string& dirName_in);

int _tmain(int argc, _TCHAR* argv[])
{

const string Folder = "C:\\tests\\MUC unverdichtet\\";


 
HANDLE fHandle;
WIN32_FIND_DATA wfd;
fHandle=FindFirstFile((LPCWSTR)Folder.c_str(),&wfd);
 
do
{

    if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) ))
    {
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            MessageBox(0,wfd.cFileName,(LPCWSTR)"Folgendes Verzeichnis wurde gefunden:",0);
        }
        else
        {
            MessageBox(0,wfd.cFileName,(LPCWSTR)"Folgende Datei gefunden:",0);
        }
    }
}
while (FindNextFile(fHandle,&wfd));
FindClose(fHandle);

return 0;
}

как же я скучаю по c# ;&#041;))

Posted by: Lord KiRon on 20-03-2013, 00:15
1. (и главное) Нафига тебе MesssageBox причем в програме которая явно консольная - хрена он что выдаст. поменяй например на cout или printf или поменяй проект на Win32, но первый вариант проще.

2. В фолдере задать маску , типа "*.*" или "." а не только путь.
3. Не забудь проверку если не нашло ничего первый раз
4. Не забывай инициализировать переменные и обнулять структуры. К твоим проблемам это не имеет никакого отношения но это правильная практика.

Posted by: Lexus on 20-03-2013, 00:45
QUOTE (Lord KiRon @ 19-03-2013, 22:15):
1. (и главное) Нафига тебе MesssageBox причем в програме которая явно консольная - хрена он что выдаст. поменяй например на cout или printf или поменяй проект на Win32, но первый вариант проще.

2. В фолдере задать маску , типа "*.*" или "." а не только путь.
3. Не забудь проверку если не нашло ничего первый раз
4. Не забывай инициализировать переменные и обнулять структуры. К твоим проблемам это не имеет никакого отношения но это правильная практика.
завтра попробую. спасибо. я тут не раз ешё буду доставать ;&#041;)

Posted by: Lexus on 20-03-2013, 13:07
CODE
const string Folder = "C:\\tests\\MUC unverdichtet\\*.*";


 
HANDLE fHandle;
WIN32_FIND_DATA wfd;
  string b = Folder+"*";
fHandle=FindFirstFile((LPCWSTR)Folder.c_str(),&wfd);
 
do
{
    if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) ))
    {
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            cout<<wfd.cFileName<<endl;

        }
        else
        {
cout<<wfd.cFileName<<endl;;

        }
    }
}
while (FindNextFile(fHandle,&wfd));
FindClose(fHandle);
Output: 0013F8DC или другие подобные.

user posted image

Posted by: Lord KiRon on 20-03-2013, 19:57
Хэндл инвалидный , значит или путь неверный или файлов не найдено. Хотя не понятно на каком этапе ты делал скриншот.

Да, и еще чтоб было проще дебагировать - выруби юникод в настройках прокта.

Posted by: Set on 21-03-2013, 10:34
Вспомнил, почему не перевариваю С++ :drag:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365200%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365200%28v=vs.85%29.aspx

Posted by: Lexus on 21-03-2013, 17:07
QUOTE (Lord KiRon @ 20-03-2013, 17:57):
Хэндл инвалидный , значит или путь неверный или файлов не найдено. Хотя не понятно на каком этапе ты делал скриншот.

Да, и еще чтоб было проще дебагировать - выруби юникод в настройках прокта.
забил я на это и сделал через dirent :&#041;

Но не расслабляйтесь, всё только наинается=

Posted by: Lord KiRon on 23-03-2013, 00:50
QUOTE (Set @ 21-03-2013, 09:34):
Вспомнил, почему не перевариваю С++ :drag:
Плохому танцору...
:diablo:

Posted by: Lexus on 30-03-2013, 15:31
Продолжимс :&#041;

Прога, что я пишу занимается парсингом гиганских файлов. Обычно файлы с 1мио строк, а то и более. задача строку считать и разбить по запятой.

std::vector<std::string> results
while(getline(ss.str,separator)
{
results.push_back(str);
}

и этот грёбанный пушбек жрёт 90% моего времени. Я пробывал сначала толкать в лист, в нём судя по описанию пушбек добрее, а потом коппировать в вектор. Но что-то всё стало медленнее чем))))

Можно ли как-то это обойти?

Posted by: Lord KiRon on 31-03-2013, 01:07
Тебе повезло что ты это не на .Net делаешь.
А вообще при таком подходе жрется до хрена памяти, тут так прямо и не решить, надо в зависимости от ситуации и использования.
Например хранить в вкторе не стринги а позиции запятых.

Posted by: Lexus on 31-03-2013, 02:14
QUOTE (Lord KiRon @ 30-03-2013, 23:07):
Тебе повезло что ты это не на .Net делаешь.
А вообще при таком подходе жрется до хрена памяти, тут так прямо и не решить, надо в зависимости от ситуации и использования.
Например хранить в вкторе не стринги а позиции запятых.
Память меня меньше CPU напрягает)))))

Posted by: Set on 31-03-2013, 07:45
Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ...

Posted by: Lexus on 31-03-2013, 11:42
QUOTE (Set @ 31-03-2013, 06:45):
Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ...
А возможно определить кол-во не читая всё файло?

Posted by: Lord KiRon on 31-03-2013, 17:49
Если ты утверждаешь что память вообще не проблема , то открывай файл черз mapped view (чтоб он при доступе "выглядел" как бафер, а не файл) и сохраняй позиции запятых в файле в отдельный вектор.
Походу можно не пользоватся вектором а хранить в массиве используя doubling, то есть держишь массив созданный через new скажем на 1000 мест и переменную "индекс" последнего свободного места + переменную размера массива.
Если дошел до последнего (1000-го) то создаешь новый массив в два раза большр (то-есть 2000) и копируешь в него старый memcopy , а старый освобождаешь и так далее...
операции подстановки лонгов в массив почти мгновенные, копирование непрерывного блока памяти тоже операция достаточно быстрая и в принципе будет (при правильно выбранном начальном размере) достаточно редкой.
Если память вообще не ограничена :&#041; можешь создать массив вообще один раз - размером с файл, тогда точно ничего и копировать не придется :&#041;

Posted by: FiL on 31-03-2013, 23:53
я не понял. ты считываешь весь файл и засовываешь его в вектор. А нахрена? Считал строку, обработал и пошел дальше. Зачем ты хранишь все прочитанные строки?

Ну и таки если уж так хочется засовывать весь файл в память (несколько странно в этом разрезе говорить о гигантских файлах), то ты-бы место в векторе выделял крупными кусками. А то для каждой строки вызывается реаллокация памяти, ибо вектор переполнился. Выделил место по 1000 строк - считал 1000. Потом снова выделил одним разом еще под 1000. И так далее. Ну, или если строк всегда более миллиона, то можно не по 1000, а по 100.000 за итерацию.

Posted by: Set on 01-04-2013, 00:02
QUOTE (Lexus @ 31-03-2013, 11:42):
QUOTE (Set @ 31-03-2013, 06:45):
Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ...
А возможно определить кол-во не читая всё файло?
Как написал FiL, увеличивай размер вектора на, скажем, миллион записей за раз. .resize() же под это дело есть... им и обрежешь излишки в конце. И не пользуйся собственными методами вектора, сделай две переменные, одну под текущую позицию, другую либо с его размером, либо с числом доступных для записи позиций.

Posted by: Lord KiRon on 01-04-2013, 00:20
QUOTE (Set @ 31-03-2013, 23:02):
QUOTE (Lexus @ 31-03-2013, 11:42):
QUOTE (Set @ 31-03-2013, 06:45):
Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ...
А возможно определить кол-во не читая всё файло?
Как написал FiL, увеличивай размер вектора на, скажем, миллион записей за раз. .resize() же под это дело есть... им и обрежешь излишки в конце. И не пользуйся собственными методами вектора, сделай две переменные, одну под текущую позицию, другую либо с его размером, либо с числом доступных для записи позиций.
С вектором стрингов не поможет, так как стринги неизвестной длины.
Тут вся проблема в том что зачем-то копируются данные из файла в памят, а зачем?

Posted by: FiL on 01-04-2013, 08:33
Ну и что, что неизвестной? Можно выделять не точно, но все равно, большими кусками. Ресурсы кушаются именно на перевыделение памяти.

А что читать всё в память не ясно зачем, так я с этого и начал. Но может оно реяльно нужно...

Posted by: Set on 02-04-2013, 07:20
Объект string имеет фиксированный размер, иначе с ним никих массивов не создать было бы. Текст внутри задаётся как char* и реально находится в "куче".

При записи строки в вектор происходит eё копирования и тут, конечно, тоже можно оптимизировать, скажем, сделав вектор ссылок на строки и явно записывая туда ссылки.

Posted by: Lexus on 02-04-2013, 15:41
QUOTE (FiL @ 31-03-2013, 22:53):
я не понял. ты считываешь весь файл и засовываешь его в вектор. А нахрена? Считал строку, обработал и пошел дальше. Зачем ты хранишь все прочитанные строки?

там инфа хранится не в строках, а в столбцах. т.е. надо всё считать, отсортировать, сравнить и так далее. но всё столбцами ;(

Posted by: FiL on 02-04-2013, 17:42
хранится столбцами, а в память суешь строками... Зачем? Потом отдельно будешь разбивать на столбцы и опять-же сувать в другую память?
Разбивай сразу при чтении, бери нужные тебе значения и суй в нужные массивы. Причем если там числа, то суй числами, а не строками. Все равно придется щто делать, так делай это во время чтения.

Posted by: Lexus on 02-04-2013, 17:53
QUOTE (FiL @ 02-04-2013, 16:42):
хранится столбцами, а в память суешь строками... Зачем? Потом отдельно будешь разбивать на столбцы и опять-же сувать в другую память?
Разбивай сразу при чтении, бери нужные тебе значения и суй в нужные массивы. Причем если там числа, то суй числами, а не строками. Все равно придется щто делать, так делай это во время чтения.
Я наверное пример реальный приведу))) Шас приготовлю все данные ;&#041; И запошу :&#041;

Posted by: Lord KiRon on 02-04-2013, 18:17
QUOTE (Set @ 02-04-2013, 06:20):
Объект string имеет фиксированный размер, иначе с ним никих массивов не создать было бы. Текст внутри задаётся как char* и реально находится в "куче".

При записи строки в вектор происходит eё копирования и тут, конечно, тоже можно оптимизировать, скажем, сделав вектор ссылок на строки и явно записывая туда ссылки.
...А куча реально фрагментируется и при реальных реэлокациях из за этой фрагментации реально же тормозит.

Posted by: FiL on 03-04-2013, 07:15
QUOTE (Lexus @ 02-04-2013, 10:53):
QUOTE (FiL @ 02-04-2013, 16:42):
хранится столбцами, а в память суешь строками... Зачем? Потом отдельно будешь разбивать на столбцы и опять-же сувать в другую память?
Разбивай сразу при чтении, бери нужные тебе значения и суй в нужные массивы. Причем если там числа, то суй числами, а не строками. Все равно придется щто делать, так делай это во время чтения.
Я наверное пример реальный приведу))) Шас приготовлю все данные ;&#041; И запошу :&#041;
Давненько мы не брали в руки шашек :&#041;
Я на самом деле вообще не уверен, что я после универа хоть одну программу написал больше 15 строк.

Posted by: Гордый on 03-04-2013, 09:43
QUOTE (FiL @ 03-04-2013, 06:15):
Я на самом деле вообще не уверен, что я после универа хоть одну программу написал больше 15 строк.
а тут что программу Hello World пишут? Я её могу на многих языках написать. :diablo: :lol:

Posted by: Lexus on 03-04-2013, 11:51
QUOTE (Гордый @ 03-04-2013, 08:43):

а тут что программу Hello World пишут? Я её могу на многих языках написать. :diablo: :lol:
тут карьера математика как програмиста на кону)))

Posted by: Lord KiRon on 03-04-2013, 18:25
Иди пиши на матлабе.
Это будет месть всем математикам, а то как подсунут "берешь вторую производную от функции контрастного фокуса", а потом неделю трахаешься как эту функцию построить и это самую производную на С++ взять.
Причем делов там на 2 минуты, но только когда обьяснят человеческим языком что имели в виду.
(И нечего мне тыкать что я математику заканчивал, кто ее там помнил после экзамена, кроме фамилий этих самых математеков, да и то с трудом)

Posted by: Lexus on 10-04-2013, 13:39
апдейт: беда поборота. Жопец был в том, что все тестировалась в дебаг-модусе. Стартуешь прогу в релизе - всё шуршит!

Posted by: FiL on 10-04-2013, 16:10
ох уж эти современные программисты с неограниченными ресурсами. А потом мы удивляемся, что комп тормозит и что винда разрослась до десятка гигабайт.

Posted by: Lexus on 11-04-2013, 09:07
QUOTE (FiL @ 10-04-2013, 15:10):
ох уж эти современные программисты с неограниченными ресурсами. А потом мы удивляемся, что комп тормозит и что винда разрослась до десятка гигабайт.
Да не, там всё очень компакто вышло))) Я же по пути не только дебаг на релиз поменял)))) Но я вас ешё не отпускаю))) Стрижка только началась)))

Posted by: Lexus on 03-05-2013, 11:42
вышел я на новый уровень камасутры и один уже не продвигаюсь.

ниже на пикчере обозначена задача:

Нужно сделать динамическую таблицу, т.е. будет во время работы проги пополняться.

первык столбец должен быть чекбоксовым, второй текстовым полем, чтом его можно было редактировать (1 и 2) можно объеденить. 3 столбец - кнопка, 4-й тоже кнопка, 5 редактируемое поле, 6 - тоже редактируемое поле, по даблклику диалог выбора файла) и справа от него чекбокс, последний просто лейбл для вывода текста.

П.с. весь секс делается в mfc c++.

user posted image



Ай нид хелп :&#041;))

Posted by: Lord KiRon on 03-05-2013, 13:19
Делай на .Net, а то затрахаешся. Мы конечно и на C++ такое делали, но довольно много тупой работы. Если уж совсем нет выбора - используй MSFleхGrid OCX , а если надо чтоб на 64 бита бежало, то тут уже платное надо, например VSFlexGrid ( http://www.componentone.com/SuperProducts/StudioActiveX/ (http://www.componentone.com/SuperProducts/StudioActiveX/ ) - можно купить один грид, за $500 примерно за лицензию разработчика, трайл бесплатный, и полнофункционал;ьный только диалогом о том что не зарегина достает при запуске.

Posted by: Lexus on 03-05-2013, 16:15
QUOTE (Lord KiRon @ 03-05-2013, 12:19):
Делай на .Net, а то затрахаешся. Мы конечно и на C++ такое делали, но довольно много тупой работы. Если уж совсем нет выбора - используй MSFleхGrid OCX , а если надо чтоб на 64 бита бежало, то тут уже платное надо, например VSFlexGrid ( http://www.componentone.com/SuperProducts/StudioActiveX/ (http://www.componentone.com/SuperProducts/StudioActiveX/ ) - можно купить один грид, за $500 примерно за лицензию разработчика, трайл бесплатный, и полнофункционал;ьный только диалогом о том что не зарегина достает при запуске.
Пока выбора нет ;( Ведушая проггерша тоже трахается над этим вопросом, но оснавная цель сделать в mfc, если уже никак, то делать в нете. А как там с привязкой нетовской оболчки к с++ коду?

Posted by: Lord KiRon on 03-05-2013, 21:01
QUOTE (Lexus @ 03-05-2013, 15:15):
QUOTE (Lord KiRon @ 03-05-2013, 12:19):
Делай на .Net, а то затрахаешся. Мы конечно и на C++ такое делали, но довольно много тупой работы. Если уж совсем нет выбора - используй MSFleхGrid OCX , а если надо чтоб на 64 бита бежало, то тут уже платное надо, например VSFlexGrid ( http://www.componentone.com/SuperProducts/StudioActiveX/ (http://www.componentone.com/SuperProducts/StudioActiveX/ ) - можно купить один грид, за $500 примерно за лицензию разработчика, трайл бесплатный, и полнофункционал;ьный только диалогом о том что не зарегина достает при запуске.
Пока выбора нет ;( Ведушая проггерша тоже трахается над этим вопросом, но оснавная цель сделать в mfc, если уже никак, то делать в нете. А как там с привязкой нетовской оболчки к с++ коду?
Можно, я делал, но трахаться придется намного больше.
А вот наоорот - без проблем MFC контроли в .Net засунуть можно.

Posted by: FiL on 08-05-2013, 05:29
на html надо такое делать. :&#041;

Posted by: Lexus on 08-05-2013, 11:31
QUOTE (FiL @ 08-05-2013, 04:29):
на html надо такое делать. :&#041;
:punk:

Posted by: VxWorks on 08-05-2013, 13:13
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh:

Posted by: Lexus on 08-05-2013, 13:31
QUOTE (VxWorks @ 08-05-2013, 12:13):
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh:
Чур тебя)))) Даже не хочу думать о таком ;&#041;))))) :fear2:

Posted by: Гордый on 08-05-2013, 13:35
QUOTE (VxWorks @ 08-05-2013, 12:13):
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh:
Травма на всю жизнь, теперь похоже на ассемблере всё пишет чел... Kроме Блога, там ещё есть слова человеческие! :lol:

Posted by: VxWorks on 08-05-2013, 13:39
QUOTE (Гордый @ 08-05-2013, 11:35):
QUOTE (VxWorks @ 08-05-2013, 12:13):
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh:
Травма на всю жизнь, теперь похоже на ассемблере всё пишет чел... Kроме Блога, там ещё есть слова человеческие! :lol:
Ты знал, ты знал! :D:


Posted by: Lexus on 08-05-2013, 13:43
Гордый сегодня в форме ;&#041;)))))

Posted by: FiL on 08-05-2013, 18:52
QUOTE (VxWorks @ 08-05-2013, 06:13):
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh:
Ну, хорошо хоть не компилятор на SQL. :&#041;

Posted by: VxWorks on 08-05-2013, 20:05
До этого не дошло :&#041; Но на dBase IV нас тоже заставляли что-то делать.
Вот только у меня на все эти БД башка не варила и не варит. :&#040;
Написать какую-нибудь хрень типа системы управления светом в машине, без операционки и тому подобных заморочек - раз плюнуть. А вот БД или там вебсайт - это сложно.

Posted by: Lexus on 20-05-2013, 22:00
Расслабились? ))) Я снова тут)

Есть MFC CFormView, из него по нажатию кнопки из списка с объектами Optimization запускается:
Optimization.validate()

Нужно, чтоб по нажатию на кнопку открывaлось окно Dialog (class RunLog) и в него писалось в list_runlog (textbox) сообшения с функции Optimization.validate(). Как я понял делается это через Callback function. Но пока я не понял как это сделать и где и как дефинировать функции и в каких классах и как....короче нужно как для дебила пояснить))) Спасибо)

Posted by: Lexus on 22-05-2013, 10:08
Кажется тут надо идти другим путём. Запускать validate во втором треде и через postmessage слать обновления в RunLog

как где почём? Хеелп)))

Posted by: FiL on 22-05-2013, 21:10
У тебя страдания не по С++, а по каким-то только тебе понятно каким библиотекам в какой-то конкретной среде. Так ты-бы описал что и где. Хотя мне оно уже не поможет.

Posted by: Гордый on 22-05-2013, 21:25
QUOTE (FiL @ 22-05-2013, 20:10):
Хотя мне оно уже не поможет.
интересно, а что может помочь FiLу!? :w00t:

Posted by: Set on 23-05-2013, 13:17
Спирт... и много. :laugh:

Posted by: Lord KiRon on 23-05-2013, 16:41
Ты в начале реши - тебе твой диалог нужен модальным или нет, если модальным, то не страдай херней оно и так работать будет. Есали немодальный то открываешь диалог , а работу делаешь в треде и туда пишешь, только обновлять надо через меседжи, а не напрямую, а то падать будет рандомально.

Posted by: Lexus on 23-05-2013, 16:47
QUOTE (Lord KiRon @ 23-05-2013, 15:41):
Ты в начале реши - тебе твой диалог нужен модальным или нет, если модальным, то не страдай херней оно и так работать будет. Есали немодальный то открываешь диалог , а работу делаешь в треде и туда пишешь, только обновлять надо через меседжи, а не напрямую, а то падать будет рандомально.
Я сейчас открываю так

RunLog RunLogDlg;
RunLogDlg.DoModal();

а можно для дебила на пальцах как с треда писать туда?

Posted by: Lord KiRon on 24-05-2013, 17:28
DoModal Создает модальный диалог, который пока не закроешь ничего не работает в "родительском окне", тебе надо сделать Create, тогда будет не модальный, это раз.
Насчет писать.
Лучше всего в него не писать, а сделать так чтоб он сам читал из какого-то списка например, при получении определенного месаджа WM_USER + xxxx , который посылается ему с твоего потока, а твой поток в этот лист добавляет.
Главное не забудь синхронизировать этот список, например critical section, то есть локай его когда твой поток добавляет и когда диалог считывает.
Это простейший к имплементации вариант.

Posted by: Lexus on 29-07-2013, 16:00
Так. С GUI уже всё отлажено и робит ;&#041;

Теперь встал вопрос эфективности. Выяснилось, что файло пишется очень медленно. Всё время использовал output<<matrix[i][j]<<"\n"; это тормозит всё дико. Есть-ли варианты писать в текстовый файл по быстрее?
fputs, fprintf?

Posted by: Set on 29-07-2013, 23:18
raid 0 на ssd :crazy:

Posted by: Lexus on 30-07-2013, 09:04
QUOTE (Set @ 29-07-2013, 22:18):
raid 0 на ssd :crazy:
Прикол в том, что диск меньше всего дрочится. в момент записи проц завален, а а хард еле подмигивает. хард ссд. Мне кажется запись через stream медленная. но чем и как заменить хз

Posted by: FiL on 30-07-2013, 17:14
a как файлт открывается?

Posted by: Lexus on 30-07-2013, 17:46
QUOTE (FiL @ 30-07-2013, 16:14):
a как файлт открывается?
ofstream

Posted by: Set on 31-07-2013, 02:04
QUOTE (Lexus @ 29-07-2013, 16:00):
Есть-ли варианты писать в текстовый файл по быстрее?
fputs, fprintf?
Определённо это будет быстрее.

Posted by: FiL on 01-08-2013, 03:23
QUOTE (Lexus @ 30-07-2013, 02:04):
QUOTE (Set @ 29-07-2013, 22:18):
raid 0 на ssd :crazy:
Прикол в том, что диск меньше всего дрочится. в момент записи проц завален, а а хард еле подмигивает. хард ссд. Мне кажется запись через stream медленная. но чем и как заменить хз
Запись через потоки не медленная. Медленная побайтовая запись в файл. Таки stream << num в конечном итоге приводит к put, который медленный. Так что лучше-бы формировать блок в памяти и потом записывать его через stream::write.

P.S. А как файл открывается таки не важно :&#041;

Posted by: Lexus on 01-08-2013, 07:11
QUOTE (FiL @ 01-08-2013, 02:23):
Запись через потоки не медленная. Медленная побайтовая запись в файл. Таки stream << num в конечном итоге приводит к put, который медленный. Так что лучше-бы формировать блок в памяти и потом записывать его через stream::write.

P.S. А как файл открывается таки не важно :&#041;
Почитал доку к пут, пут пишет всё дело блоками автоматом, по дефолту идёт буффер BUFMAX и потом flush на хард. Заменил stream<<num на fprintf - время записи сократилось в двое, но формотирование другое, надо поиграться будет.

А нельза кк-то в память загнать блок, скажем так 50мб, и потом его за раз записать?

Posted by: FiL on 01-08-2013, 17:21
ну я-же сказал... через write. Выделяешь 50 мегов в памяти, суешь туда чего надо и потом write ему.
по поводу Put - да, оно в буфер, а потом flush. Теперь вопрос - а когда "потом" этот flush происходит?

Posted by: Set on 02-08-2013, 06:23
Как заполнится так и flush :D:

QUOTE:
А нельза кк-то в память загнать блок, скажем так 50мб, и потом его за раз записать?
Таки можно :kroulik: setbuf() для fprintf и компании, для стримов что-то подобное тоже есть.

Posted by: Lexus on 02-09-2013, 11:55
Чтоб вам не скучалось, я дальше потуплю ;&#041;

Есть проект MFC C++ в VS2012, там из диалогов место для названия фирмы клиента. Задача, можно как-то автоматизировать процесс компайлинга, а именно:
нужно поменять имя клиента на нужное и скомпилить в диру с этим именем. Клеинтов порядка 20, поэтому делать это в ручную - мега жопа.

Posted by: Lord KiRon on 04-09-2013, 16:23
Используй переменные среды
SET CLIENT=ВАСЯ_ПУПКИН
Ну а потом в настройках компиляции проекта настраивай Output Directory на $(CLIENT) .
То же самое в тех же настройках precompiler definitions CLIENT_NAME=$(CLIENT) ну и использиуй CLIENT_NAME в коде.
Чтобы не повторятся делаешь несколько .bat файлов с SET CLIENT=... для каждого клиента , которые и запускают компиляцию.

Posted by: Lexus on 11-09-2013, 09:30
QUOTE (Lord KiRon @ 04-09-2013, 15:23):
Используй переменные среды
SET CLIENT=ВАСЯ_ПУПКИН
Ну а потом в настройках компиляции проекта настраивай Output Directory на $(CLIENT) .
То же самое в тех же настройках precompiler definitions CLIENT_NAME=$(CLIENT) ну и использиуй CLIENT_NAME в коде.
Чтобы не повторятся делаешь несколько .bat файлов с SET CLIENT=... для каждого клиента , которые и запускают компиляцию.
Гениально, всё работает ;&#041;

Спасибо всем, кто помогал. испытательный срок пройден ;&#041;))))

Posted by: Michael2000 on 08-11-2013, 17:08
http://habrahabr.ru/post/187770/ (http://habrahabr.ru/post/187770/

коменты жесть :drag:

Posted by: Lexus on 08-01-2014, 15:13
Моя здесь и снова вопросы)))

Нужно с c++ создать экселевскую таблицу с графиками. Есть ли какие-то бесплатные калссы или аддоны? Находил многие, но в них не было возможности графики строить.

Posted by: Lord KiRon on 10-01-2014, 20:44
QUOTE (Lexus @ 08-01-2014, 14:13):
Моя здесь и снова вопросы)))

Нужно с c++ создать экселевскую таблицу с графиками. Есть ли какие-то бесплатные калссы или аддоны? Находил многие, но в них не было возможности графики строить.
Есть, если офис стоит то через COM без проблем. Готовые компоиненты устанавливаются вместе с любым офисом.
Правда есть специфика - если заполнять большую таблицу по одной клетке то тормоза будут...
Короче по минимуму - легко, а если вникать в детали , то как и везде - целое искуство.
https://support.microsoft.com/kb/196776 (https://support.microsoft.com/kb/196776

Posted by: Lexus on 10-01-2014, 20:54
QUOTE (Lord KiRon @ 10-01-2014, 18:44):
QUOTE (Lexus @ 08-01-2014, 14:13):
Моя здесь и снова вопросы)))

Нужно с c++ создать экселевскую таблицу с графиками. Есть ли какие-то бесплатные калссы или аддоны? Находил многие, но в них не было возможности графики строить.
Есть, если офис стоит то через COM без проблем. Готовые компоиненты устанавливаются вместе с любым офисом.
Правда есть специфика - если заполнять большую таблицу по одной клетке то тормоза будут...
Короче по минимуму - легко, а если вникать в детали , то как и везде - целое искуство.
https://support.microsoft.com/kb/196776 (https://support.microsoft.com/kb/196776
Таблицы не большие.
А если , например, у меня стоит на компе 2010 офис, народ юзает 2007, то будет ли работать?

Posted by: Lord KiRon on 10-01-2014, 22:28
QUOTE (Lexus @ 10-01-2014, 19:54):
QUOTE (Lord KiRon @ 10-01-2014, 18:44):
QUOTE (Lexus @ 08-01-2014, 14:13):
Моя здесь и снова вопросы)))

Нужно с c++ создать экселевскую таблицу с графиками. Есть ли какие-то бесплатные калссы или аддоны? Находил многие, но в них не было возможности графики строить.
Есть, если офис стоит то через COM без проблем. Готовые компоиненты устанавливаются вместе с любым офисом.
Правда есть специфика - если заполнять большую таблицу по одной клетке то тормоза будут...
Короче по минимуму - легко, а если вникать в детали , то как и везде - целое искуство.
https://support.microsoft.com/kb/196776 (https://support.microsoft.com/kb/196776
Таблицы не большие.
А если , например, у меня стоит на компе 2010 офис, народ юзает 2007, то будет ли работать?
В принципе должно, хотя чтоб наверняка я бы 2007-м разрабатывал, тогда на всех последующих точно будет. Но если тебе Excel то офис с Экселом должен быть.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)