получить строки из буфера - PullRequest
0 голосов
/ 25 июня 2010

Я хочу получить строки из буфера необработанных байтов в памяти, будет хорошо работать?

static int in = 0; 

void *loadFile (FILE *fp) 
{
    fseek (fp, 0L, SEEK_END);
    size_t size = ftell (fp);
    fseek (fp, 0L, SEEK_SET); 


    char *buf = malloc (sizeof(char) * size);
    if (!buf)
        return NULL;

    if (fread (buf, sizeof(char), size, fp) != size) {
        free (buf);
        return NULL;
    }

    return buf;
}

char *getString (void *buf) 
{
    char *l_buf = buf;

    int i, j, num;
    char *string = NULL;

    for (i = in; l_buf[i] == '\n' || l_buf[i] == '\r'; i++); 

    for (j = i; l_buf[j] != '\n' && l_buf[j] != '\r'; j++); 

    num = j - i;
    string = malloc (sizeof(char) * (num + 1));

    if (!string) 
        return NULL;

    in = j;

    strncpy (string, &l_buf[i], num);
    string[num] = '\0';

    return string;
}

Ответы [ 2 ]

1 голос
/ 26 июня 2010

Я полагаю, что есть по крайней мере одна проблема с предложенным решением, и это не проверка, чтобы убедиться, что вы не запустили конец буфера памяти в getString ().Таким образом, одним из способов избежать этого в вашем коде чтения было бы добавление явного NULL в конец буфера, например,

char *buf = malloc (sizeof(char) * (size + 1));
if (!buf)
   return NULL;

if (fread (buf, sizeof(char), size, fp) != size) {
    free (buf);
    return NULL;
}
buf[size] = `\0`;

И затем в вашей функции извлечения строки добавьте проверку NULL к завершению строкитесты, что-то вроде этого:

for (i = in; l_buf[i] != '\0' && (l_buf[i] == '\n' || l_buf[i] == '\r'); i++);
if (l_buf[i] == '\0') {
    /* Never saw the start of a line before the buffer ran out */
    return NULL;
}

for (j = i; l_buf[i] != '\0' && l_buf[j] != '\n' && l_buf[j] != '\r'; j++);
if (i == j) {
    return NULL;
}

Существует еще одна потенциальная проблема, но, поскольку вы не сказали, работали ли вы в UNIX или Windows или заботились о переносимости, я не уверен.Предложенный код не имеет отношения к завершению строки, которое включает в себя как `\ r ', так и' \ n '.

Я бы также предложил сделать функцию входа в нее повторной, заменив глобальный индекс начальной позиции параметромвот так:

char *getString (void *buf, int *in) { ...

Затем просто обновите этот указатель в getString () примерно так:

*in = j;
1 голос
/ 26 июня 2010

Все ссылки на buf[i] должны быть l_buf[i]. buf [i] индексирует по пустому указателю (не то, что вам нужно), но l_buf [i] индексирует по указателю char.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...