2015-08-07 4 views
1

Я пытаюсь прочитать содержимое файла в строку, и у меня возникают проблемы с распределением памяти для строки. Я читаю в файле строку за строкой, b/c Я хочу пропустить первые две строки.Чтение в файле в строку

int counter=1; 
char *myhtml; 
myhtml=calloc(1,10); 

while ((read = getline(&line, &len, fp)) != -1) 
{ 
    if (counter>2) 
    { 
     //printf("%s",line); 
     myhtml=realloc(myhtml,sizeof(char)*strlen(line)); 
     strcat(myhtml,line);       
    } 
    counter++; 
} 

Как я могу перераспределить память для такого рода функций?

+5

Возможно, стоит перечитать документацию для 'realloc()'. В частности, он не увеличивает * выделенный размер блока памяти, он * устанавливает * новый размер на все, что вы просите. –

+2

Кроме того, подумайте о том, что произойдет, если 'realloc' выйдет из строя и вернет' NULL', тогда вы потеряете исходный указатель, если вы переназначаете указатель, который вы перераспределите. –

+1

Способ, которым вы пользуетесь 'strcat', напоминает мне об этом: http://www.joelonsoftware.com/articles/fog0000000319.html –

ответ

2

До тех пор, пока вы просто чтение в файл, вы можете просто выделить все пространство для файла сразу, как:

struct stat statbuf; 
stat("testfile", &statbuf); 
char *myhtml = calloc(1,statbuf.st_size); 

и, возможно, освободить оставшуюся после того как вы закончите чтение в. Какой способ дешевле, потому что malloc довольно дорогой

+1

Чтобы сделать строку C из содержимого добавьте 1 к длине для завершения '' \ 0''. (И надеюсь, что в содержимом файла нет '' \ 0'' символов ...) Также проверьте свои возвращаемые значения. О, используйте 'fstat()' в дескрипторе файла после того, как вы откроете файл, так как файл должен быть открыт в любом случае. –

0

есть несколько проблем с размещенным кодом.

Вместо того, чтобы подробно описывать каждую проблему. просто сравните опубликованный код со следующим

Следующий код устраняет эти «проблемы» и работает быстрее, поскольку «счетчик» не тестируется и не увеличивается, а также «счетчик» загромождает стек.

char *myhtml = NULL; // the accumulated lines 
char *line = NULL; // the current line 
int len;    // set by the readline() function 

// read and discard first two lines 
getline(&line, &len, fp); 
free(line); 
line = NULL; 
getline(&line, &len, fp); 
free(line); 
line = NULL; 

while ((getline(&line, &len, fp)) != -1) 
{ 
    char *temp = NULL; // so do not lose pointer to already allocated memory 
    if(NULL ==(temp=realloc(myhtml,strlen(myhtml)+len+1)))) 
    { // realloc failed 
     perror("realloc failed"); 
     free(myhtml); // cleanup 
     free(line); // cleanup 
     exit(EXIT_FAILURE); 
    } 

    // implied else, realloc successful 

    myhtml = temp; 
    strcat(myhtml,line); 
    free(line); // getline() performs a hidden malloc(), so have to free()) 
    line = NULL; // reset for next iteration 
} 
Смежные вопросы