2015-03-22 2 views
0

как динамически выделять память для строки?Динамическое выделение памяти строки

Я хочу взять текстовый файл в качестве ввода и хочу сохранить символы файла в строке.

Сначала я подсчитываю количество символов в текстовом файле, а затем динамически выделяю строку для этого размера, а затем хочу скопировать текст в строку.

main() 
{ 


    int count = 0; /* number of characters seen */ 
    FILE *in_file; /* input file */ 

    /* character or EOF flag from input */ 
    int ch; 

    in_file = fopen("TMCP.txt", "r"); 
    if (in_file == NULL) { 
     printf("Cannot open %s\n", "FILE_NAME"); 
     exit(8); 
    } 

    while (1) 
    { 
     ch = fgetc(in_file); 
     if (ch == EOF) 
      break; 
     ++count; 
    } 
    printf("Number of characters is %d\n", 
        count); 


    char *buffer=(char*)malloc(count*(sizeof(char))); 
} 
+0

и в чем проблема, с которой вы сталкиваетесь? –

+0

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

+0

также, ваш код является неполным. 'main' должен, по крайней мере, иметь тип возврата. –

ответ

2

Это ужасное решение. Вы можете определить размер файла с помощью загрузки методов (найдите размер файла tell, и особенно для fstat), и вы можете просто загрузить файл mmap, указав именно этот буфер.

+0

спасибо .mmap не очищается –

+0

Google mmap. Существует много документации, включая статью [wikipedia article] (http://en.wikipedia.org/wiki/Mmap). –

0

Один из вариантов состоит в том, чтобы прочитать файл фиксированного размера в то время и расширить динамический буфер при чтении файла. Что-то вроде следующего:

#define CHUNK_SIZE 512 
... 
char chunk[CHUNK_SIZE]; 
char *buffer = NULL; 
size_t bufSize = 0; 
... 
while (fgets(chunk, sizeof chunk, in_file)) 
{ 
    char *tmp = realloc(buffer, bufSize + sizeof chunk); 
    if (tmp) 
    { 
    buffer = tmp; 
    buffer[bufSize] = 0; // need to make sure that there is a 0 terminator 
         // in the buffer for strcat to work properly. 
    strcat(buffer, chunk); 
    bufSize += sizeof chunk; 
    } 
    else 
    { 
    // could not extend the dynamic buffer; handle as necessary 
    } 
} 

Этот фрагмент кода считывает до 511 символов из in_file в то время (fgets обнулит концевая заделка целевой массив). Он будет выделять и расширять buffer для каждого фрагмента, затем объединить ввод в buffer. Для правильной работы strcat буфер назначения должен быть оканчивающимся на 0. Это не гарантируется в первый раз, когда буфер первоначально выделен, хотя он должен быть на последующих итерациях.

Другая стратегия - удвоить размер буфера каждый раз, что приводит к меньшему количеству звонков realloc, но это, вероятно, легче понять.

Смежные вопросы