1 Востаннє редагувалося #Sparta (24.09.2015 23:33:49)

Тема: Проблема з видаленням вказівника.

Усім привіт!
Ось поставили мені задачу заставити студію читати з файлу "блоками" до кінця стрічки.
Типу до тих пір поки буфер переповнений - продовжувати читати.
Суть в тому , що все працює :)
Але я виділив пам'ять , отже потрібно її видалити.
А воно "свариться". Сидів гуглив.Чесно *CRAZY*   Але толком нічого не пишуть:) У кожного окремий випадок цієї проблеми. *WALL*

Тому , якщо хтось може щось пояснити чи підказати як цю проблему виправити  - буду дуже вдячний! :)
Ось код :


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILE_NAME "Input.txt"
#define FILE_MOD "r"
#define BUFFER_SIZE 255


int main()
{
    FILE *infile = fopen(FILE_NAME,FILE_MOD);
    if (infile == NULL)
    {
        printf("Error\n");
        return 0;
    }
    
    char buff[BUFFER_SIZE];
    
    
    while (!feof(infile))
    {
            char *tmp = NULL;
            int iTotalLen = 0;
            
            while (true)
            {
                fgets(buff,BUFFER_SIZE,infile);
                
                int len = strlen(buff);
                
                tmp = (char*)realloc(tmp, len + iTotalLen);
                
                strcpy(tmp + iTotalLen, buff);
                
                iTotalLen += len;

                if (len < 255) break;

            }
            printf(tmp);

            delete tmp;// ось тут проблема 
    }
    
    fclose(infile);
}

Там помилка щось типу : "HEAP CORRUPTION DETECTED" ]:->

Студент НУ "ЛП".

2

Re: Проблема з видаленням вказівника.

C - printf, malloc, realloc, free
C++ - cout, new, delete
Плутати їх - може скінчитися дуже погано.

Подякували: #Sparta1

3

Re: Проблема з видаленням вказівника.

koala написав:

C - printf, malloc, realloc, free
C++ - cout, new, delete
Плутати їх - може скінчитися дуже погано.

Розумієте , спочатку думав (хоча це абсурд) - діло в free(tmp) і спробував варіант з delete.
Це останній варіант програми.
Спробуйте компільнути.
Фішка в тому , якщо закоментувати той рядок з видаленням , то все працює.
Але це ж не правильно! %)

От і не знаю , що його робити.

Студент НУ "ЛП".

4

Re: Проблема з видаленням вказівника.

У мене все працює. ЩЯРНТ?

Подякували: #Sparta1

5 Востаннє редагувалося #Sparta (24.09.2015 23:25:55)

Re: Проблема з видаленням вказівника.

koala написав:

У мене все працює. ЩЯРНТ?

Дивно. Я ребутнув ПК - проблема так і залишається. Можливо, проблема в самій студії ? О_о

Студент НУ "ЛП".

6

Re: Проблема з видаленням вказівника.

Думаю, проблема в тому, що "щось типу", а не точне повідомлення про помилку.
Ну і вирівняйте код, майте повагу до читачів.

7 Востаннє редагувалося #Sparta (24.09.2015 23:42:27)

Re: Проблема з видаленням вказівника.

Ну ось скріншот.
Код підрівняв.

Post's attachments

Untitled.png 104.15 kb, 61 downloads since 2015-09-24 

Студент НУ "ЛП".

8 Востаннє редагувалося #Sparta (24.09.2015 23:56:53)

Re: Проблема з видаленням вказівника.

koala написав:

У мене все працює. ЩЯРНТ?

Стоп.А в самій студії пробували компілювати?

Студент НУ "ЛП".

9 Востаннє редагувалося koala (25.09.2015 00:06:41)

Re: Проблема з видаленням вказівника.

А хто вам сказав, що проблема була саме в тому рядку?

fgets(buff,BUFFER_SIZE,infile);//читаємо до кінця рядка, файла чи BUFFER_SIZE-1 знаків
int len = strlen(buff);//якщо у файлі був '\0', ми вже в халепі
tmp = (char*)realloc(tmp, len + iTotalLen);
strcpy(tmp + iTotalLen, buff);
iTotalLen += len;
if (len < 255) break;//а от і наша халепа
Подякували: #Sparta1

10 Востаннє редагувалося #Sparta (25.09.2015 00:07:30)

Re: Проблема з видаленням вказівника.

koala написав:

А хто вам сказав, що проблема була саме в тому рядку?

                fgets(buff,BUFFER_SIZE,infile);//читаємо до кінця рядка, файла чи BUFFER_SIZE-1 знаків
                int len = strlen(buff);//якщо у файлі був '\0', ми вже в халепі
                tmp = (char*)realloc(tmp, len + iTotalLen);
                strcpy(tmp + iTotalLen, buff);
                iTotalLen += len;
                if (len < 255) break;//а от і наша халепа


Хм. Дякую.
А якщо використати

do{...}while(len<255)
Студент НУ "ЛП".

11 Востаннє редагувалося koala (25.09.2015 00:10:39)

Re: Проблема з видаленням вказівника.

Тоді буде

do{...}while(len<255)//а от і наша халепа

Подивіться, які значення len набуває.

Подякували: #Sparta1

12

Re: Проблема з видаленням вказівника.

koala написав:

Тоді буде

do{...}while(len<255)//а от і наша халепа

Подивіться, які значення len набуває.

:D
Забавно. Теж дійшов такого висновку:)
Загалом  дуже Вам дякую!)
Буду думати далі

Студент НУ "ЛП".

13

Re: Проблема з видаленням вказівника.

Вам тут потрібен тільки один цикл, до feof-а. Якщо файл бінарний - користуйтеся fread. І краще одразу виводьте, що прочитали, інакше всі переваги блокового вводу втрачаються. realloc - повільна операція.

Подякували: #Sparta1