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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Автоматическое преобразование стандартных типов http://www.cyberforum.ru/cpp/thread95214.html
Если моя функция LOG принимает qString* можно ли сделать так чтобы автоматически вызывалась конструирование временного объекта и он отправлялся в фунцию? т.е. вместо LOG(&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
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
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 лучше перестраховаться....
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru