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

std::string, std::fstream, ошибка кучи - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Автоматическое преобразование стандартных типов http://www.cyberforum.ru/cpp/thread95214.html
Если моя функция LOG принимает qString* можно ли сделать так чтобы автоматически вызывалась конструирование временного объекта и он отправлялся в фунцию? т.е. вместо LOG(&qString("Привет мир")); просто LOG("Привет мир"); Объявление LOG такое: void LOG(qString* Error, ...); Мне нужно заявить как то компилятору что бы он мог преобразовывать из const char* в qString ? Что должна делать...
C++ "цепной" << Я просто не в курсе, так можно: cout << "Here is 5: " << 5 << "\ n";? http://www.cyberforum.ru/cpp/thread94750.html
C++ Нейросети
Слышал, что нейросети на самом деле моделятся программно. А как? Как делать классы сети и нейрона? Как соединять нейроны в сеть? Куда подавать вход и в какой форме? Как и откуда снимать отклик? Каковы приблизительно возможности таких сетей? Как оценить число нейронов, необходимое для решения задачи? Как оценить время отклика? Как учить сеть? За счёт чего поддерживается такое обучение? Не уверен,...
C++ Ортогональная таблица
Есть таблица БД с композитным возможным ключом из двух полей, двух композитных сущностей, или обычного поля и композитной сущности. Надо значениям одного из этих полей/композитов сопоставить столбцы экранной таблицы, а значение второго поля пусть соответствуют строкам и подписать строки/столбцы в заголовочных столбцах/строках соответствующими значениями полей (только обычных, если столбцам...
C++ Будильник http://www.cyberforum.ru/cpp/thread93886.html
Пожалуйста, подскажите, как написать будильник в электронных часах? И как сделать, чтобы будильник выключался при нажатии на клавишу? напишите алгоритм
C++ Студия с командной строки Меня окончательно задолбали IDE, и я хочу юзить с командной строки c++ компиляторы студии: 1. Microsoft Developmet Studio 4.0, 2. Microsoft Developmet Studio 6.0? Где валяются и как называются экзешинки компилов этих студий? Где взять инфу по опциям командной строки компилов этих студий? Как вручную собрать несколько опций в один файл? Как правильно указать этот файл компилу? подробнее

Показать сообщение отдельно
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
16.02.2010, 01:32  [ТС]
Проблема была решена, однако я так и не понял из за чего она возникла. Сейчас я просто сел и переписал последнюю свою разработку - систему частиц. Там я попытался использовать принцип уменьшения зависимостей когда класс содержит лишь указатели и в .h нет include никаких... видимо это действительно приводило к каким то проблемам. В действительности я нашёл пару ошибок где из локального объекта копировалось значение указателя а не делалась копия в объект. Фактически же я не понял в чем проблема, возможно она была и не в этом (было бы плохо). Но все это урок мне. Где классу нужны данные там не стоит писать указатель, указатель... вернее не знаю может и можно когда осторожно, запутался я при таком большом количестве связей.
И все же у меня имеются некоторые подозрения насчет правильности загрузки данных из файлов. С вашего позволения выложу код, кому не лень пробегитесь глазами, нет ли бреда? Загрузка файлов это моя нелюбимая тема к сожелению. Итак, код:
C++
1
2
3
4
5
// Проходим по всем файлам в папке data\\strings
// применяя к файлу алгоритм FileManager::String
// загружать только файлы с расширением "shm"
// pStrings - указатель приемника данных загружаемых из файла
FileManager::FromDir(FileManager::String, "data\\strings", pStrings, "shm", "\0");
FileManager::FromDir
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
bool FromDir(bool(*LoadAlgoritm)(const char* FilePath, void* Target), char* Path, void* Target, char* Exts, ...)
{
    WIN32_FIND_DATA FFD; 
    HANDLE hSearch = INVALID_HANDLE_VALUE; 
    
    std::string sPath, sFileName, sFullPath, sExt;
    sPath = Path; sPath += "\\*.*";
    unsigned short int Count = 0, Divider = 0;
 
    if ((hSearch = FindFirstFile(sPath.c_str(), &FFD)) == INVALID_HANDLE_VALUE) 
        return false; // в противном случае выходим
    sPath = Path; sPath += "\\";
    do
    {
        // Если нашли папку - следующий ход
        if ( FFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
            continue;
        sFileName = FFD.cFileName;
        sFullPath = sPath + sFileName;
        // Для определения окончания заведем разделитель
        Divider = sFileName.find_last_of('.');
        // Определяем окончание найденного файла
        sExt.assign(sFileName, Divider+1, sFileName.length()-Divider);
        bool CorrectExt = false; char** TempExts = &Exts;
        do {
            if ( sExt == *TempExts )
            {
                CorrectExt = true;
            break;
            }
            TempExts++;
        } while ( (*TempExts)[0] != NULL ); // если текущая строка пуста - конец
         // Если этот файл имеет некорректное разрешение ищем следующий
        if ( CorrectExt == false ) continue;
            // теперь в sFullPath есть полный путь к файлу
        // и цель записи, куда алгоритм запишет данные
        LoadAlgoritm(sFullPath.c_str(), Target);
    }
    while (FindNextFile(hSearch, &FFD)); // ищем следующий файл
    FindClose(hSearch); // заканчиваем поиск
return true;
}

FileManager::String
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
// Загрузка строковых данных
bool String(const char* FileName, void* Target)
{
    StringGroup* Temp = (StringGroup*)Target;
    StringGroup& Strings = *Temp; // работаем с приемником данных
    // Открываем файл
    std::fstream CurFile(FileName, std::ios::in);
    // Переменные для считываемых из файла значений
    std::string CURLINE, KEYWORD;
    while ( CurFile.eof() == false )
    {
        // Читаем строку из файла
        std::getline(CurFile, CURLINE);
        // Вырезаем все до первой табуляции\пробела\запятой - получаем ключевое слово
        SW::CutBefore(KEYWORD, CURLINE, "\t ,");
            int Cur22 = CURLINE.find(0x22);
        // Обе кавычки найдены
        if ( CURLINE.find(0x22, Cur22+1) != 0xffffffff )
        {
            // В строке CURLINE оставить только то что находится между первыми двумя '"' (0x22 HEX)
            SW::CutBetween(&CURLINE, 0x22);
        }
        else
        {
            SW::CutBefore(CURLINE, CURLINE, "\t ,\\/");
        }
            // Если строка пустая
        if ( KEYWORD == "" )
            continue;
        // Если комментарий
        if ( KEYWORD == "//" )
            continue;
        
        // загружаем строку CURLINE в репозиторий строк по индексом hash(KEYWORD)
        const char* Key = KEYWORD.c_str();
        size_t Size = CURLINE.length() + 1;
        memcpy(Strings.Write(Key, Size), CURLINE.c_str(), Size);
    }
    CurFile.close();        
return true;
}

Остальные ресурсы грузятся подобным образом, в цикле "while ( CurFile.eof() == false )" обрабатываются все строки файла и анализируются по ключевым словам. KEYWORD, CURLINE обычно служат в виде источника и лишь иногда изменяются. На SW::CutBetween и SW::CutBefore не обращайте внимания, это кривые но работоспособные функции... в принципе все. Боюсь я за загрузку файлов потому как разбирался в этом лишь поверхностно и как сделал сразу забыл. Т.к. ошибка появилась именно std::fstream лучше перестраховаться....
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru