Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++ WinAPI]Загрузка строк в массив


Автор: lamber 1.4.2011, 01:50
Не заю может изобретаю велосипед, но все же захотелось мне закинуть написать ф-цию закидывания строк в массив, но без использования 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));
    }


}

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

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

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

Автор: lamber 1.4.2011, 09:27
2GremlinProg
Везде где происходит операция со строками я слежу чтоб присутствовал нулевой символ. Я в коде указал где вываливается ошибка, в коментариях. Так что наверное нужно копать в эту сторону. а именно когда я освобождаю буффер temp 

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

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

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

Автор: lamber 1.4.2011, 10:46
2GremlinProg
Я наверное слишком "тугой" покажи плз кодом, а то твоя моя не понимает )))

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

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

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


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

Автор: GremlinProg 2.4.2011, 17:23

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

Автор: lamber 3.4.2011, 11:30
Да думаю можно отправлять уже туда

Автор: GremlinProg 3.4.2011, 19:33

M
GremlinProg

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

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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)