Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++ WinAPI]Загрузка строк в массив, WinAPI 
:(
    Опции темы
lamber
Дата 1.4.2011, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



Не заю может изобретаю велосипед, но все же захотелось мне закинуть написать ф-цию закидывания строк в массив, но без использования stl string а просто на char'ах и с использованием WinAPI. Если есть более простое решение то буду рад увидеть. После долгих мучений вот к чему пришел, одно но char'ы у меня где-то текут. Гляньте господа и укажите что не так. 
Код

void LoadFileInArray(HANDLE& hFile,char**& strarr)
{
    char buffer[10];
    char* temp_buff;
    char *temp=NULL;
    DWORD nIn;
    size_t lines=0;
    size_t offset=0;
    size_t index=0;
    size_t size;
    ZeroMemory(buffer,sizeof(buffer));
    while(ReadFile(hFile,buffer,sizeof(buffer)-1,&nIn,NULL) && nIn>0)
    {
        buffer[nIn]='\0';
        while(buffer[index]!='\0')
        {
            if(buffer[index]=='\n')
            {
                if(temp!=NULL)
                {
                    size=size=&buffer[index]-&buffer[offset]+strlen(temp);
                    strarr[lines]= new char[size+1];
                    strcat(strarr[lines],temp);
                    strncat(strarr[lines],&buffer[offset],&buffer[index]-&buffer[offset]);
                    strarr[size]='\0';
                    delete[] temp;
                }else
                {
                size=&buffer[index]-&buffer[offset];
                strarr[lines]= new char[size+1];
                strncpy(strarr[lines],&buffer[offset],size);
                strarr[lines][size]='\0';
                }
                offset=index+1;
                lines++;
            }
            index++;

        }
        if(offset!=index)
        {
            if(temp!=NULL)
            {

                size=strlen(temp)+(&buffer[index]-&buffer[offset]);
                temp_buff= new char[size];
                strcpy(temp_buff,temp);
                strncat(temp_buff,&buffer[offset],&buffer[index]-&buffer[offset]);
                temp_buff[size]='\0';
                //течет тут выдает Heap Corruption 
                delete[] temp;
                temp = new char[size];
                strcpy(temp,temp_buff);
                delete[] temp_buff;
                temp[size]='\0';

            }else{
            size=&buffer[index]-&buffer[offset];
            temp= new char[size];
            strncpy(temp,&buffer[offset],size);
            temp[size]='\0';
            }
        }
        index=0;
        offset=0;
        ZeroMemory(buffer,sizeof(buffer));
    }


}

PM MAIL   Вверх
GremlinProg
Дата 1.4.2011, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: нет
Всего: 106



на первый взгляд:
Цитата(lamber @  1.4.2011,  03:50 Найти цитируемый пост)

strarr[lines]= new char[size+1];
strcat(strarr[lines],temp);

первой строкой распределил мусорный буфер, а второй строкой - добавил к этому мусору что-то из temp,
только ведь strcat ищет ноль в мусоре, после которого включает temp, и нет гарантии, что этот ноль будет в пределах size+1,
вот и повреждение кучи


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
lamber
Дата 1.4.2011, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



2GremlinProg
Везде где происходит операция со строками я слежу чтоб присутствовал нулевой символ. Я в коде указал где вываливается ошибка, в коментариях. Так что наверное нужно копать в эту сторону. а именно когда я освобождаю буффер temp 
PM MAIL   Вверх
GremlinProg
Дата 1.4.2011, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: нет
Всего: 106



Цитата(lamber @  1.4.2011,  11:27 Найти цитируемый пост)
Так что наверное нужно копать в эту сторону. а именно когда я освобождаю буффер temp

нет, это момент, когда ошибка уже обнаружена,
а сделана она между распределением и удалением блока
Цитата(lamber @  1.4.2011,  11:27 Найти цитируемый пост)
Везде где происходит операция со строками я слежу чтоб присутствовал нулевой символ

в смысле?
следить ни за кем не надо,
надо обнулить первый символ этого буфера перед вызовом strcat


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
lamber
Дата 1.4.2011, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



2GremlinProg
Я наверное слишком "тугой" покажи плз кодом, а то твоя моя не понимает )))
PM MAIL   Вверх
xvr
Дата 1.4.2011, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Попробуйте в строке 26 обнулить temp после delete[] temp, а то он у вас потом используется (после delete)

PM MAIL   Вверх
GremlinProg
Дата 1.4.2011, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: нет
Всего: 106



Цитата(lamber @  1.4.2011,  03:50 Найти цитируемый пост)

strarr[lines]= new char[size+1];
strarr[lines][0] = '\0';
strcat(strarr[lines],temp);




--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
lamber
Дата 2.4.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



Что-то не помогло((( Уже перепробовал много чего не могу понять протестите плз код у себя, буду очень признателен за плюсую куда нужно ну или символически на WM могу закинуть за правильный ответ.

Это сообщение отредактировал(а) lamber - 2.4.2011, 13:20
PM MAIL   Вверх
GremlinProg
Дата 2.4.2011, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: нет
Всего: 106




M
GremlinProg
здесь этим врят ли кто-то будет заниматься, переместить в ЦП?



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
lamber
Дата 3.4.2011, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



Да думаю можно отправлять уже туда
PM MAIL   Вверх
GremlinProg
Дата 3.4.2011, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: нет
Всего: 106




M
GremlinProg

Для домашних заданий, курсовых, существует \"Центр Помощи\".

Тема перемещена из раздела C/C++: Системное программирование и WinAPI




--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0516 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.