Открыть текстовый файл:
fsrc = fopen(argv[1],"rt");
Определить его размер:
long fsize(FILE *f)
{
long pos, end;
pos = ftell(f);
fseek(f,0,SEEK_END);
end = ftell(f);
fseek(f,pos,SEEK_SET);
return end;
}
Выделить памяти:
long src_size = fsize(fsrc);
char *buf = new char[src_size+1];
Зачитать в нее собственно текст:
fread(buf,src_size,1,fsrc);
Последний символ файла не ноль, поэтому пририсовываем к буферу ноль и дальше работаем с ним, как с длинной строчкой текста:
buf[src_size] = 0;
parser.add_source(buf);
Потом обнаруживается, что в конце буфера 304 байта мусора, и потом собственно ноль, который я туда написал. То есть текста считалось из файла на 304 байта меньше, хотя размер файла определяется верно.
Я-то знаю, почему это так.
научно-исследовательский центр изучения практики участия детей в жизни гражданского общества
Showing posts with label programming. Show all posts
Showing posts with label programming. Show all posts
Friday, August 27, 2010
Tuesday, November 10, 2009
статистики и статистического анализа пост
мое личное впечатление при первом взгляде (да и при втором тоже и спустя год) на сает onetwo.tomsk.ru такое: "ДА ВЫ ЗАПАРИЛИ УЖЕ СО СВОИМ СРАНЕ ГРАЙНДКОРОМ, МЕТАЛКОРОМ, ДЭТОМ И СКРУДЖЕМ!!!1"
безответственные выкрики с места - лучший способ навязать свое мнение собеседнику, но в этот раз я решил теоретически обосновать данные наблюдения. тем более, что это не так уж сложно. формул, во всяком случае, придумывать никаких не пришлось.
последовательно выполнил в своей командной строке следующие свои команды, ура:
for /L %i in (1,1,6000) do wget -O temp%%i.html http://onetwo.tomsk.ru/group/main/%i/
for %i in (*.html) do grep -o -E "&style=[0-9]+.>[^<>]+" %i >> styles-list.tmp
gawk -f makehist.awk styles-list.tmp | sort -r -n >hist.txt
в результате выполнения этих заклинаний, файл hist.txt стал содержать в себе отсортированные по убыванию частоты встречаемости музыкальных стилей музыкальных групп, музыкальные альбомы которых были выложены на музыкальном саете onetwo.tomsk.ru.
2924 байта текста из файла hist.txt копипастим в эксель, строим гистрограмму, вдумчиво на нее смотрим, делаем далеко идущие выводы, пишем статью, защищаем диссертацию, ура.
топ-50 стилей:

p.s.
makehist.awk (добрый кирилл любезно согласился мне этот файл написать, потому что я в awk ничерта не понимаю):
BEGIN{FS=">"}
{ar[$2]=ar[$2]+1}
END{for (i in ar) {print ar[i] " \"" i "\"" }}
p.p.s
вопрос, на который я еще не придумал ответ: дело в том, что аудиофилы живущие на этом саете, не удовлетворяются наличием 138 стилей музыки, и многим группам ставят в соответствие несколько стилей. тогда как здесь, на гистограмме, отображена частота встречаемости стилей вообще. как бы мне связать из с группами и отобразить понагляднее, а?
безответственные выкрики с места - лучший способ навязать свое мнение собеседнику, но в этот раз я решил теоретически обосновать данные наблюдения. тем более, что это не так уж сложно. формул, во всяком случае, придумывать никаких не пришлось.
последовательно выполнил в своей командной строке следующие свои команды, ура:
for /L %i in (1,1,6000) do wget -O temp%%i.html http://onetwo.tomsk.ru/group/main/%i/
for %i in (*.html) do grep -o -E "&style=[0-9]+.>[^<>]+" %i >> styles-list.tmp
gawk -f makehist.awk styles-list.tmp | sort -r -n >hist.txt
в результате выполнения этих заклинаний, файл hist.txt стал содержать в себе отсортированные по убыванию частоты встречаемости музыкальных стилей музыкальных групп, музыкальные альбомы которых были выложены на музыкальном саете onetwo.tomsk.ru.
2924 байта текста из файла hist.txt копипастим в эксель, строим гистрограмму, вдумчиво на нее смотрим, делаем далеко идущие выводы, пишем статью, защищаем диссертацию, ура.
топ-50 стилей:
p.s.
makehist.awk (добрый кирилл любезно согласился мне этот файл написать, потому что я в awk ничерта не понимаю):
BEGIN{FS=">"}
{ar[$2]=ar[$2]+1}
END{for (i in ar) {print ar[i] " \"" i "\"" }}
p.p.s
вопрос, на который я еще не придумал ответ: дело в том, что аудиофилы живущие на этом саете, не удовлетворяются наличием 138 стилей музыки, и многим группам ставят в соответствие несколько стилей. тогда как здесь, на гистограмме, отображена частота встречаемости стилей вообще. как бы мне связать из с группами и отобразить понагляднее, а?
Tuesday, June 2, 2009
выстрелил тут себе в ногу.
у меня есть класс который конвертирует говно в специальное концентрированное говно.
class Compressor{
public:
Compressor();
int work(const char *src,char *dst);
private:
int uber_data;
int settings;
char *govnobuf;
};
Compressor *compressors = new Compressor[CPU_COUNT];
ну и они, экземпляры, там запускаются в разных потоках одновременно.
все работает, никаких вопросов.
и тут пришло время прикрутить второй вид концентратора SuperCompressor2.
полиморфизм и отделение интерфейса от реализации спасут нас, решил я и немедленно сделал так:
class AbstractCompressor
{
public:
virtual int work(const char *src,char *dst) = 0;
};
class Compressor: public AbstractCompressor{ ... };
class SuperCompressor2: public AbstractCompressor
{
public:
SuperCompressor2();
int work(const char *src,char *dst);
private:
int settings2;
char *govnobuf;
char *interimbuf;
};
ага.
AbstractCompressor *compressors;
if(application.settings.what_compressor_to_use)
compressor = new Compressor[CPU_COUNT];
else
compressor = new SuperCompressor2[CPU_COUNT];
очень круто. скомпилял, и внутренне радуясь своей сообразительности, запустил.
радость пропала ровно через двадцать секунд, когда программа упала с AV, при вызове
compressor[i].work(src,dst);
расстроился и вернул все обратно. почему? потому что при обращению к массиву компилятор вычисляет смещение исходя из определения оного, то есть получается
(AbstractCompressor *)((char *)compressor + i*sizeof(AbstractCompressor))
ежу понятно, что размеры у базового класса и унаследованного ниразу не обязаны совпадать. а массив, заметьте, выделен как массив дочерних классов. через это у меня случается стресс и депрессия, а у компилятора - говнокод.
спасибо.
у меня есть класс который конвертирует говно в специальное концентрированное говно.
class Compressor{
public:
Compressor();
int work(const char *src,char *dst);
private:
int uber_data;
int settings;
char *govnobuf;
};
Compressor *compressors = new Compressor[CPU_COUNT];
ну и они, экземпляры, там запускаются в разных потоках одновременно.
все работает, никаких вопросов.
и тут пришло время прикрутить второй вид концентратора SuperCompressor2.
полиморфизм и отделение интерфейса от реализации спасут нас, решил я и немедленно сделал так:
class AbstractCompressor
{
public:
virtual int work(const char *src,char *dst) = 0;
};
class Compressor: public AbstractCompressor{ ... };
class SuperCompressor2: public AbstractCompressor
{
public:
SuperCompressor2();
int work(const char *src,char *dst);
private:
int settings2;
char *govnobuf;
char *interimbuf;
};
ага.
AbstractCompressor *compressors;
if(application.settings.what_compressor_to_use)
compressor = new Compressor[CPU_COUNT];
else
compressor = new SuperCompressor2[CPU_COUNT];
очень круто. скомпилял, и внутренне радуясь своей сообразительности, запустил.
радость пропала ровно через двадцать секунд, когда программа упала с AV, при вызове
compressor[i].work(src,dst);
расстроился и вернул все обратно. почему? потому что при обращению к массиву компилятор вычисляет смещение исходя из определения оного, то есть получается
(AbstractCompressor *)((char *)compressor + i*sizeof(AbstractCompressor))
ежу понятно, что размеры у базового класса и унаследованного ниразу не обязаны совпадать. а массив, заметьте, выделен как массив дочерних классов. через это у меня случается стресс и депрессия, а у компилятора - говнокод.
спасибо.
Thursday, November 27, 2008
радости жизни на работе.
n = new_passes_counter;
counter += new_passes_counter;
new_passes_counter -= n;
а и еще вот такие конструкции периодически встречаю:
for(i=0; i < N; i++){
foo();
if(i < N && !p){
bar();
}
blabla();
if(i < N){
blablabla();
}
}
это пиздец, товарищи. и эти люди работают в конторе с мировым именем.
у меня это этого начинается стресс и депрессия.
щетаю, что надо читать курсы про инварианты циклов.
Tuesday, April 15, 2008
как посчитать размер папки в репозитории
паритесь с чекаутом из свн-а?
не знаете сколько весит каталог, который вы хотите залить к себе и боитесь скачать слишком много внешнего траффика?
воспользуйтесь новым инженерным тоником от нашей компании!
используя его, вы сможете с точностью до байта узнать размер интересующего вас каталога и верно оценить свои возможности!
@echo off
echo sample usage: svn_count_bytes.cmd http://svn.xiph.org/trunk/ao/
echo returns full size of this folder in bytes (without externals)
if "%1" == "" (set url=.) else (set url=%1)
echo obtain files list...
svn list -R --xml %url% >files.tmp
echo counting...
set sum=0
for /f "tokens=2* delims=>" %%i in ('grep "[0-9].[0-9]*" -o files.tmp') do set /a sum = sum + %%i
echo %sum% bytes
del files.tmp
не знаете сколько весит каталог, который вы хотите залить к себе и боитесь скачать слишком много внешнего траффика?
воспользуйтесь новым инженерным тоником от нашей компании!
используя его, вы сможете с точностью до байта узнать размер интересующего вас каталога и верно оценить свои возможности!
@echo off
echo sample usage: svn_count_bytes.cmd http://svn.xiph.org/trunk/ao/
echo returns full size of this folder in bytes (without externals)
if "%1" == "" (set url=.) else (set url=%1)
echo obtain files list...
svn list -R --xml %url% >files.tmp
echo counting...
set sum=0
for /f "tokens=2* delims=>" %%i in ('grep "
echo %sum% bytes
del files.tmp
Thursday, March 13, 2008
на досуге читал исходники ogg theora и иже с ними.
декодер
/* never forget that globals are a one-way ticket to Hell */
ogg_sync_state oy;
ogg_page og;
...
#ifdef _WIN32 /* We need to set stdin/stdout to binary mode on windows. */
/* Beware the evil ifdef. We avoid these where we can, but this one we
cannot. Don't add any more, you'll probably go to hell if you do. */
_setmode( _fileno( stdin ), _O_BINARY );
_setmode( _fileno( stdout ), _O_BINARY );
#endif
...
/*Yes, yes, we're going to hell.*/
#if defined(_WIN32)
#include < io.h>
#endif
енкодер
/* You'll go to Hell for using globals. */
...
/* You'll go to Hell for using static variables */
...
декодер
/* never forget that globals are a one-way ticket to Hell */
ogg_sync_state oy;
ogg_page og;
...
#ifdef _WIN32 /* We need to set stdin/stdout to binary mode on windows. */
/* Beware the evil ifdef. We avoid these where we can, but this one we
cannot. Don't add any more, you'll probably go to hell if you do. */
_setmode( _fileno( stdin ), _O_BINARY );
_setmode( _fileno( stdout ), _O_BINARY );
#endif
...
/*Yes, yes, we're going to hell.*/
#if defined(_WIN32)
#include < io.h>
#endif
енкодер
/* You'll go to Hell for using globals. */
...
/* You'll go to Hell for using static variables */
...
Wednesday, December 5, 2007
памятники архитектуры
while(!exit_flag){
pframe = get_src_frame(×tamp);
encoder->set_dst_addr(out_buffer[idx]);
encoder->encode_frame(pframe,×tamp);
pdst = encoder->get_frame(&size);
deliver(out_buffer[idx],timestamp);
}
когда вы кодируете мупег, там есть такая особенность, которая называется reordering delay. одним из следствий этой особенности является то, что запихав в енкодер кадр и его время, на выходе мы можем ничего не получить или получить, но другой совсем кадр, который был целых восемьдесять миллисекунд назад. логично, что вместе с этим кадром из прошлого нам надо получить его размер и его же время.
так как же блядь так получилось, что размер закодированного кадра я получаю при вызове функции get_frame, адрес буфера я задаю заранее функцией set_dst_addr (а возвращаемое значение get_frame вообще никого не интересует и это даже компилятор понимает), а время мне записывают в timestamp при вызове функции encode_frame на место переданного ей туда времени текущего кадра?
щас все переделаю.
Thursday, September 13, 2007
почему я больше не читаю rsdn
А>1). Сравните: "VeryLongNameOfSomeVariable" и "very_long_name_of_some_variable". IMHO второе намного читабельнее. Всё-таки в русском языке мы разделяем слова пробелами, а не изменением регистра букв.
Ты видать на php долгое время писал, вот тебе и читабельнее Да и памяти вторая строка больше займет
вот же балбесы, етить..
самое грусное, что там половина обсуждений такой характер носит..
Tuesday, September 11, 2007
дураки и циклы do { } while
в некоторых coding-style rules встречаются примечания типа "не использовать цикл do-while!". и я всегда недоумевал, зачем так вот строго? нормальная такая конструкция, очень удобная в определенных случаях..
пока я не встретил проект в котором все циклы перечисления были сделаны, блядь, через do {} while.
даже не просто все циклы перечисления, а ВСЕ циклы вообще.
ну то есть, надо например перебрать все макроблоки в слайсе. что делает это сцуко кодер?
я догадываюсь, из-за чего это он так сделал и если мои подозрения оправдаются, сцуко буду бросаться гавном и требовать о разжаловании имярека в младшие черпальщики.
и сцуко, запретить циклы do-while насовсем в корпоративном кодинг стиле!!
пока я не встретил проект в котором все циклы перечисления были сделаны, блядь, через do {} while.
даже не просто все циклы перечисления, а ВСЕ циклы вообще.
ну то есть, надо например перебрать все макроблоки в слайсе. что делает это сцуко кодер?
int pos_y = 0;
do{
int pos_x = 0;
do{
// lot of stuff
// ...
// two pages below
pos_x += 16;
}while(pos_x < width);
pos_y += 16;
}while(pos_y < height);
я догадываюсь, из-за чего это он так сделал и если мои подозрения оправдаются, сцуко буду бросаться гавном и требовать о разжаловании имярека в младшие черпальщики.
и сцуко, запретить циклы do-while насовсем в корпоративном кодинг стиле!!
Thursday, September 6, 2007
написать тетрис
написать игру тетрис, которая бы давала очки не только за заполненные линии, но и за другие составленные игроком фигурки.
то есть, например, сгружает пользователь фигурки, сгружает, и тут у него получается лесенка из четырех или даже пяти кубиков - программа немедленно говорит "стрит!" и дает игроку тыщу очков. а если кубики одного цвета, то две тыщи.
то есть, например, сгружает пользователь фигурки, сгружает, и тут у него получается лесенка из четырех или даже пяти кубиков - программа немедленно говорит "стрит!" и дает игроку тыщу очков. а если кубики одного цвета, то две тыщи.
Thursday, May 10, 2007
printf в гуевом приложении
Вот я пишу гуевое приложение. Мне в нем приходится использовать много (дохуя) постороннего кода, который валит отладочную информацию используя одновременно калбэки, printf и OutputDebugString. Если калбэки я ему предоставляю свои и всё, что валится в отладочную консоль - я вижу, то инфа, выведенная через printf, пропадает и никак мне ее не прочитать.
А переписывать весь этот код не то что бы нельзя, но неохота.
Способ решения я придумал такой:
// создаем консоль
AllocConsole();
// перенаправляем c-runtime вывод в нее
freopen("CONOUT$","w",stdout);
p.s. в шестом вижуальнике работает.
А переписывать весь этот код не то что бы нельзя, но неохота.
Способ решения я придумал такой:
// создаем консоль
AllocConsole();
// перенаправляем c-runtime вывод в нее
freopen("CONOUT$","w",stdout);
p.s. в шестом вижуальнике работает.
Subscribe to:
Posts (Atom)