Загрузить файл в массив Char * - PullRequest
1 голос
/ 30 декабря 2011

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

Спасибо за любую помощь.

- EDIT -

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

void loadIniIntoMemory() {

    FILE *fp ;
    fp = fopen (iniFile, "r");
    int ch;
    final_line_num = 0;
    int char_index = 0;

    char* current_line = (char*) malloc(sizeof(char) * MAX_INI_LINE_LENGTH);

    while((ch = fgetc(fp)) != EOF) {

        if(ch == '\n') {

            // new line
            *(current_line + char_index) = '\0';
            char_index = 0;
            iniFileData[final_line_num] = current_line;
            final_line_num++;
            current_line = (char*) malloc(sizeof(char) * MAX_INI_LINE_LENGTH);

        } else if(ch != '\r') {

            // regular char
            *(current_line + char_index) = ch;
            char_index++;

        }

    }

    iniFileData[final_line_num] = current_line;

    fclose(fp);

}

Ответы [ 4 ]

3 голосов
/ 30 декабря 2011

Для начала, вы не инициализируете char_index, то есть, скорее всего, в нем будет мусор.Если вы не инициализируете его, ваша программа добавит неизвестное число к указателю current_line.

int char_index = 0; /* initialize to 0 */

Во-вторых, немного более "естественный" синтаксис будет:

current_line[char_index] = ...

В-третьих, вы можете проверить символы, не используя их целочисленные эквиваленты:

if (ch == '\n') {
/* this is the same as "ch == 10" */

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

fclose(fp);

Наконец, яЯ не уверен, что ch == 13 ('\r') и continue предназначены для обработки, поскольку continue фактически не используется, но вы, вероятно, не хотите копировать его в данные:

if (ch != '\r') {
    current_line[char_index] = ch;
    char_index++;
    /* or on one line: current_line[char_index++] = ch; */
}

Кроме того, мощной особенностью C (и многих других языков) является оператор switch:

/* substitutes your if...elseif...else */
switch (ch) {
case '\n':
    current_line[char_index] = '\0';
    char_index = 0;
    iniFileData[final_line_num++] =  current_line;
    break; /* <-- very important, C allows switch cases to fall thru */

case '\r':
    /* do nothing */
    break;

default:
    /* any character that is not a newline or linefeed */
    current_line[char_index++] = ch;
    break;
}
2 голосов
/ 30 декабря 2011

Помимо того, что уже указали другие, вам также придется переместить вызов выделения линейного буфера в цикл и сразу после оператора final_line_num++;.В противном случае каждая новая прочитанная вами строка будет перезаписывать предыдущую.

2 голосов
/ 30 декабря 2011

Вы не инициализировали char_index.Я полагаю, вы хотите инициализировать его до 0. В C неинициализированная переменная будет содержать мусор.Скорее всего, ваш char_index равен очень большому числу.

0 голосов
/ 30 декабря 2011

И некоторые операционные системы, такие как большинство POSIX-совместимых, в частности Linux, позволяют отображать файловый сегмент (возможно, весь файл) в виртуальную память.В Linux вы можете использовать системный вызов mmap

...