Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: ne_viens
Дата сообщения: 28.06.2013 12:58
>Файл может быть не ini, как тогда.
>

Тогда берём другую ф-ю.
Да и
FILE* f = fopen("C:\\Windows\\users.ini", "r");
if(!f)
return 0;
fclose(f);
return 1;
не такая уж и длинная.

> 1. Вопрос: есть где нибудь комплект готовых функций, который содержит популярные
> функции? Хочется отталкиваться от готового, и если что допиливать. Под популярные
> функции подразумеваю ситуацию, когда любой человек, чтобы не писать каждый раз
> заново свой код, преобразует некоторые наработки в законченную функцию,
> чтобы потом просто вставлять модуль в программу и он работает.

Они сами накапливаются в C:\code\archive с годами.

> 2. Как вставить регулярное выражение в свой код?

Свой grep написать, чтоли? На линуксах-юниксах просто с #include <regex.h>, на винде ctrl-c, ctr-v из PCRE или regex или любого другого regular expression кода.

Автор: bomzzz
Дата сообщения: 28.06.2013 14:23
не хочешь не делай. мне никакие библиотеки не нужны.
Автор: AZJIO
Дата сообщения: 28.06.2013 15:38
ne_viens

Цитата:
Они сами накапливаются в C:\code\archive с годами.
Вот поэтому я решил разрушить этот стереотип, и не смотря на то что никто не выкладывает свои коллекции, то я решил выложить. Это избавляет новичков повторно наступать на те же грабли и возвращатся опять к изобретению колеса.

Представь первый вариант, что 10 000 программистов будут с нуля изобретать велосипед, каждый у себя на коленке, и представим второй вариант, что каждый делает вклад в общее развитие, я думаю что второй подход будет в 10 000 раз продуктивнее.


Цитата:
не такая уж и длинная.
Почему бы тогда это не оформить в функцию и включить его в инклуд UserFile.h? Ещё добавить проверку атрибута "D", чтобы кроме флага "существует" возвращать ещё флаг, что это файл или каталог.



Цитата:
Свой grep написать, чтоли? На линуксах-юниксах просто с #include <regex.h>, на винде ctrl-c, ctr-v из PCRE или regex или любого другого regular expression кода.
Да, типа #include <regex.h> от PCRE, я скачал, почитал, но ни чего не понял. Не так давно в утилиту RegExp я хотел добавить лексер, но обработка десятками регулярных выражений в AutoIt3 создаёт заметную перерисовку, хотел написать обработку посимвольно, в принципе получился бы принцип рег.выр. но оптимизированно. Например считывает лексер символ, если открывается скобка, то записывает увеличение счётчика +1 и помечает символ меткой определяющий тип метасимвола, далее считывает открывающую ещё +1, закрывающую -1. А если символ экранирования, то тоже с включением счётчика, при нечётном числе экранирующих символов последний становится метасимволом. Затем с помощью таблицы "позиция символа"|"цвет символа" устанавливается раскраска. Но вот такая обработка в AutoIt3 будет ещё затратнее чем регулярные выражения. Аналогичный алгоритм хотелось бы написать и для баз данных, своего рода компактная база данных, в которой разделитель элементов экранировался бы.

Вот поисковик исходников stackoverflow.com
Автор: ne_viens
Дата сообщения: 30.06.2013 11:16
Обычно они не накапливаются в своём первоначальном виде а подпиливаются под мои конкретные нужды. Для других легче будет взять из перичного источника, чем мой и потом ещё разбиратся, что я там подпилил.

Простой regex с примером вызова: http://www.cse.yorku.ca/~oz/regex.bun
Код развернуть надо с sh, или убрать начальные Х и разделить по файлам grep.c, makefile, re_fail.c, regex.3, regex.c и regex.h вручную.
Автор: AZJIO
Дата сообщения: 30.06.2013 21:13
ne_viens
У меня тоже есть под свои нужды, многие находятся в папке с проектом какой либо програмки, другие по месяцам разложены в папке "примеры". Естественно я не выкладываю черновиковые папки. Есть просто папка с оригиналами брилиантовых скриптов, разложенных по автору. Там же есть и моя личная папка, мои концепции к примеру "drag-and-drop для GUI", "Поддержка многоязычности" и т.д. и т.п.
Автор: HNKTO
Дата сообщения: 04.07.2013 21:21
Вопрос знатокам: А можно ли как-нибудь дописать (и/или стереть) данные в середину файла?
Ну, вроде текстовые редакторы типа форточного блокнота так делают?
Или это у меня "обман зрения" и на практике там создаётся новый файл, в который копируется старый+изменения, а затем новым замещается старый?
====================================================================
"нестандартные" Библиолтеки функций - это хорошо.
Но есть ещё интересный вопрос: что быстрее? Изобрести велосипед на коленке или найти?
Автор: AZJIO
Дата сообщения: 05.07.2013 02:42
HNKTO
Насколько я знаю файл можно прочитать с середины а записать в середину не удаётся. Может я не прав, потому что торренты при скачивани создают цельный файл большого размера, а потом пишет данные по позициям. С базами данных вроде таже ситуация, изменение ячейки не сопровождается переписыванием всего файла.


Цитата:
Но есть ещё интересный вопрос: что быстрее? Изобрести велосипед на коленке или найти?
Это ко мне вопрос? В том что нашёл надо ещё разобраться, а некоторым не дано разобраться в том что на порядок выше их понимания. Особенно если другой язык, другой стиль, другая конструкция/форма. Кстати, центрирование окна есть функция в WinAPI, но она не поддерживается в WinXP. Если функция написана правильно то в ней не составит труда разобраться, есть входные параметры. При поиске можно нарваться на средненькие/слабенькие варианты и пока не разберёшься в их действии или пока не помйёшь професионализм автора до тех пор ничего не узнаешь. Я "drag-and-drop" в своих скриптах 3 раза менял, пока не нашёл по этой ссылке, вариант, который я сейчас использую, а прошло несколько лет.
Автор: Abs62
Дата сообщения: 05.07.2013 07:13
AZJIO

Цитата:
Может я не прав, потому что торренты при скачивани создают цельный файл большого размера, а потом пишет данные по позициям.

Данные в середине файла можно изменить, переписав их другим блоком того же размера. Но нельзя ни вставить, ни удалить, не переписывая весь файл.
Автор: bomzzz
Дата сообщения: 05.07.2013 12:05
разве это утверждение само себе не противоречит?

у меня двдром полетел а я это сразу не заметил, потому что обленился и отключил проверку после записи. получилось десять дисков на которых файлы (фильмы) были побиты в серединке, инет был еще дорогой пришлось их перекачивать с торрента - один блок всего. потом специальной программой делать заплатки.
Автор: HNKTO
Дата сообщения: 05.07.2013 21:19

Цитата:
Данные в середине файла можно изменить, переписав их другим блоком того же размера. Но нельзя ни вставить, ни удалить, не переписывая весь файл.

А как такое осуществить не подскажите? Хотя-бы в общем.
Вариант:
char Tbuf = {"abc"};
hFile = fopen("Filename.txt", "r+");
fwrite( Tbuf, 1, 3, hFile);
fclose(hFile);
У меня не приводил к каким либо изменениям в Filename.txt.
Автор: akaGM
Дата сообщения: 05.07.2013 21:40
hFile = fopen("Filename.txt", "r+");
fwrite( Tbuf, 1, 3, hFile);

а что такое r+ ?
Автор: Abs62
Дата сообщения: 05.07.2013 21:58
HNKTO
В общем посоветую для начала взять учебник по C и изучить главу про указатели, что они означают и зачем нужны. В чём разница между char и char *, и почему fwrite хочет именно char *.
Ну и, конечно же, проверять возвращаемое значение fopen, на самом ли деле файл открылся.

akaGM

Цитата:
а что такое r+ ?

Дык, чтение + запись, вестимо.
Автор: dragon010
Дата сообщения: 05.07.2013 23:00
HNKTO
Сдается мне, раз ты тут, то учебники читать лень, так что просто замени первую строчку на
const char *Tbuf = "abc";


хотя хоть чуть-чуть разобраться в теме, перед тем как спрашивать, не самоя плохая привычка...
Автор: akaGM
Дата сообщения: 06.07.2013 00:00
Abs62

всегда писал "r" для чтения, "w" для записи, и "а" для дописывания...
Автор: AZJIO
Дата сообщения: 06.07.2013 00:30
HNKTO
Если честно ожидал больше знаний. Ну как, нравится посыл в справку? Вместо 5 букв "fseek".

Код: //пример использования функции fseek

#include <cstdio>
#include <iostream>


int main()
{

FILE * ptrFile = fopen( "example.txt" , "r+" );

//fputs( "This is sample." , ptrFile ); // записать в файл строку
fseek( ptrFile , 9 , SEEK_SET ); // изменить позицию на 9 байт относительно начала файла
fputs( "parta" , ptrFile ); // дописать слово в файл
fclose ( ptrFile );
return 0;
}

Автор: HNKTO
Дата сообщения: 08.07.2013 00:01

Цитата:
Ну как, нравится посыл в справку? Вместо 5 букв "fseek"

Вполне. Просто тогда 1) влом туда заглянуть было 2)было пора баиньки т. к. время поста+1 - рано утром на работу =)
AZJIO, спасибо за рабочий пример. fseek - это да.
Возможно косяки ВизуалСтудии 2010, но если вызывать fwrite зразу после fread - то данные в файл не записываются. А если на оборот - fread какую-то фигню возвращает, вместо данных из файла.
Короче это меня ввело немного в ступор.
......................
пример в посте 22:19 05-07-2013
мдя. Вот и придумывай на вскидку что-нибудь на работе вечером.
Тупо приношу извинения.
Автор: AZJIO
Дата сообщения: 08.07.2013 01:56
HNKTO

Цитата:
оборот - fread какую-то фигню возвращает, вместо данных из файла.
Если сделал запись в файл, то обязательно делать fflush, перед тем как считывать данные.

При операциях записи в открытый файл используется буфер ввода / вывода размером 128 байт. Данные передаются в буфер и сбрасываются на диск только после заполнения буфера или при закрытии файлового указателя функцией fclose(). Функция fflush() предназначена для принудительного сброса данных из буфера, это гарантирует сохранение информации в физический файл.

Осуществляя доступ к файлу, который открыт для чтения и записи, не следует сразу за операцией ввода выполнять операцию вывода, не прибегнув прежде к промежуточному вызову одной из следующих функций: fflush(), fseek(), fsetpos() или rewind(). Нельзя также сразу за операцией вывода выполнять операцию ввода, не прибегнув прежде к промежуточному вызову одной из перечисленных выше функций. Исключением является момент достижения конца файла во время операции ввода, т.e. в конце файла вывод может непосредственно следовать за вводом.
Автор: HNKTO
Дата сообщения: 08.07.2013 23:11
AZJIO, спасибо. Сфотографировал.
Автор: say24
Дата сообщения: 09.07.2013 15:14
Задача по ШАБЛОНАМ - не для слабонервных

Нужно что-то вроде многомерного списка с разными типами данных:
1. Добавляем по очереди несколько одномерных массивов (тип данных массивов - разный!) в один контейнер, также в другой контейнер, и т. д.
2. Добавляем конейнер в ТАКОЙ ЖЕ вышестоящий контейнер, и ещё добавляем контейнер и т. д.
и т.д.


Код:
template<class T> class ReursiveContainer
{
T* ArrayOfData;
public:
ReursiveContainer(T* PointerToData)
{
ArrayOfData = PointerToData;
}
T GetElement(int i)
{
return ArrayOfData[ i];
}
};

void f()
{
// На первом уровне - всё проходит: добавляем реальные данные
double ArrayOfDouble[] = {0.1, 0.5, 1.5};
ReursiveContainer<double> *MyContainerDouble = new ReursiveContainer<double>(ArrayOfDouble);
int ArrayOfInt[] = {100, 1, -20};
ReursiveContainer<int> *MyContainerDouble = new ReursiveContainer<int>(ArrayOfInt);
// Однако, дальше то как?
ReursiveContainer<ReursiveContainer<?????????????????> > *MyConteiner_Level_2;
}
Автор: panda3
Дата сообщения: 11.07.2013 14:25
say24
1. Шаблоны используются для выбора алгоритма при компиляции. При работе программы для этих целей нужно использовать виртуальные функциии или операторы ветвления.
2. Какой ты хочешь иметь тип выражения:
Код: MyConteiner_Level_3->GetElement[i]->GetElement[j]->GetElement[k]
Автор: say24
Дата сообщения: 11.07.2013 15:38
Прикольно, хоть и не совсем универсально.
Свою задачу - я решил, правда "красивого решения" с универсальным контейнером - так и не придумал. У меня задача была - не совсем про контейнеры, это я тут - упростил, чтобы не описывать огромную идею. Мне действительно надо было связать контейнеры в иерархию через рекурсивный объект, но - для обработки данных. А решил так: запаковал нижний уровень, где реальные данные:

Код: template<class T> class Container_class
{
private:
    T* SourcePointer;
    int SourceSize;
    Container_Recursive_class *Container_Recursive;
    bool Container_Recursive_Ready;
public:
    Container_class(T* SourcePointer__a, int SourceSize__a)
    {
        SourcePointer = SourcePointer__a;
        SourceSize = SourceSize__a;
        Container_Recursive = new Container_Recursive_class();
        Container_Recursive_Ready = Container_Recursive->Add(SourcePointer, SourceSize, sizeof(T));
    }

    bool IsLinked() { return (Container_Recursive->IsLinked()); }

    bool Flag() { return (Container_Recursive->Flag()); }

    void LinkUp(Container_Recursive_class *Upper_ContainerRecursive)
    {
        if(Container_Recursive_Ready) if(!Container_Recursive->IsLinked()) Upper_ContainerRecursive->Add(Container_Recursive);
    }

    T P()
    {
        int i = -1;
        if(Container_Recursive_Ready) i = Container_Recursive->I();
        return ((i>=0 && i<SourceSize) ? SourcePointer[ i ] : 0);
    }
};
Автор: Stalker
Дата сообщения: 01.08.2013 13:24
Помогите понять смысл вот такого определения типа данных

Код:
typedef void (*alt_isr_func)(void* isr_context, alt_u32 id);
Автор: akaGM
Дата сообщения: 01.08.2013 13:29
typedef void (*alt_isr_func)(void* isr_context, alt_u32 id);

определяется новый тип alt_isr_func -- указатель на функцию, ничего не возвращающую и принимающую два аргумента (void*, alt_u32)
Автор: Stalker
Дата сообщения: 01.08.2013 13:49
akaGM, спасибо!
Просто не понял смысла объявлять параметры в типе данных.

Причем, я так понял, это не обязательно должна быть функция ничего не возвращающая,
void вместе с * означает, что тип указателя будет определён позднее, при объявлении самой функции, но он не обязательно будет void.
Автор: akaGM
Дата сообщения: 01.08.2013 14:00
Stalker

нет...
ты путаешь формат вызова функции (её прототип) с просто указателем (пусть даже и на неё)...

alt_isr_func pFunc;
void *p;

void myFunc1(void* a1, alt_u32 a2)
{
}

int myFunc2(void* a1, alt_u32 a2)
{
}


pFunc = myFunc1; можно
pFunc = myFunc2; а это нельзя...
pFunc = (alt_isr_func)p; можно
p = (void *)pFunc; тоже можно, только непонятно зачем...

и вообще...

Цитата:
в функции для регистрации прерывания
нужно быть предельно аккуратным, в нормальных библиотеках для таких дел должны быть свои предопределённые типы...
Автор: dragon010
Дата сообщения: 01.08.2013 21:02
Stalker

Цитата:

Цитата: в функции для регистрации прерывания

нужно быть предельно аккуратным, в нормальных библиотеках для таких дел должны быть свои предопределённые типы...
Автор: Aleksoid1978
Дата сообщения: 02.08.2013 07:44
Всем привет.
Есть "интересный" вопрос знатокам MFC.
Диалог настроек, создается с помощью CPropertySheet.
Вот скрин:


Сколько я не ковырялся, так и не смог понять - почему размер диалога буквально на пару пикселей меньше(по высоте) чем TreeCtrl. У меня такое чувство что это сам MFC так выводит.


P.S. Вопрос снят - нашел как менять размер.
Автор: Stalker
Дата сообщения: 02.08.2013 08:21
akaGM dragon010 спасибо!

Цитата:
в нормальных библиотеках для таких дел должны быть свои предопределённые типы

Функция регистрации alt_irq_register() и объявление типа alt_isr_func — библиотечные.
Далее я создаю свой обработчик прерывания в соответствии с предопределённым типом alt_isr_func

Код: void ISR_SPI_receive(void* a, alt_u32 b)
{
...
};
Автор: Abs62
Дата сообщения: 02.08.2013 17:48
Stalker

Цитата:
А в функцию регистрации передаю указатель на обработчик с преобразованием типа


Цитата:
Думаю, это правильно и компилятор не ругается.

Компилятор тут и не может ругаться, потому что приведением типа программист ему говорит "заткнись, я знаю, что делаю".
Автор: Stalker
Дата сообщения: 02.08.2013 18:53
Abs62

Ага )
При этом, если сразу объявить функцию с типом alt_isr_func

alt_isr_func ISR_SPI_receive(void* a, alt_u32 b)

и передать в регистратор без преобразования — появляется предупреждение о несоответствии типов.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.