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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ В конструктор класса передать объект этого класса http://www.cyberforum.ru/cpp/thread95425.html
Вопрос на засыпку :) Как в конструктор класса передать объект этого класса? Т.е. class A { public: A(const char* s){} ... private: string str;
C++ Автоматическое преобразование стандартных типов Если моя функция LOG принимает qString* можно ли сделать так чтобы автоматически вызывалась конструирование временного объекта и он отправлялся в фунцию? т.е. вместо LOG(&qString("Привет мир")); просто LOG("Привет мир"); Объявление LOG такое: void LOG(qString* Error, ...); Мне нужно заявить как то компилятору что бы он мог преобразовывать из const char* в qString ? Что должна делать... http://www.cyberforum.ru/cpp/thread95214.html
Visual C++ MFC: перезаписать файл
Добрый вечер! При работе с файлом (file.dat), бывает необходимо перезаписать данные в процессе работы. CFile cFile; cFile.Open("..\file.dat", CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite, NULL); ... cFile.Read(...);//работаю с файлом ...
C++ "цепной" <<
Я просто не в курсе, так можно: cout << "Here is 5: " << 5 << "\ n";?
C++ Процедурный тип http://www.cyberforum.ru/cpp/thread94748.html
Не заню, как в c++, в других языках есть понятие "процедурный тип". Процедурным типом называется тип указателя на подпрограмму. Для object pascal есть рекомендация, как описывать такие типы: при описании процедурного типа, после его имени и знака равенства пишут оператор procedure или function в зависимости от типа подпрограммы, далее в скобках описывают формальные параметры, как в заголовке...
C++ Нейросети Слышал, что нейросети на самом деле моделятся программно. А как? Как делать классы сети и нейрона? Как соединять нейроны в сеть? Куда подавать вход и в какой форме? Как и откуда снимать отклик? Каковы приблизительно возможности таких сетей? Как оценить число нейронов, необходимое для решения задачи? Как оценить время отклика? Как учить сеть? За счёт чего поддерживается такое обучение? Не уверен,... подробнее

Показать сообщение отдельно
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
16.02.2010, 01:32  [ТС]     std::string, std::fstream, ошибка кучи
Проблема была решена, однако я так и не понял из за чего она возникла. Сейчас я просто сел и переписал последнюю свою разработку - систему частиц. Там я попытался использовать принцип уменьшения зависимостей когда класс содержит лишь указатели и в .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 лучше перестраховаться....
 
Текущее время: 03:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru