将文件加载到Char *数组中

时间:2011-12-30 15:09:18

标签: c io

感到愚蠢地问这个问题,因为这应该很容易,但我无法弄清楚什么是错的。

void loadIniIntoMemory() {

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

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

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

        if(ch == 10) {

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

        } else {

            // regular char
            *(current_line + char_index) = ch; // CAN'T DO THIS, CRASH
            char_index++;

            if(ch == 13) {
                // carriage return
                continue;
            }

        }

    }

}

自从我做了C之后不久,它在这一行崩溃了:*(current_line + char_index) = ch;

感谢您的帮助。

- 编辑 -

此外,没有人注意到,此代码不保存最后一行。这是完整,正确,有效的代码,它将文件保存到指针数组中。

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 个答案:

答案 0 :(得分:3)

对于初学者,你没有初始化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;
}

答案 1 :(得分:2)

您没有初始化char_index。我想你想把它初始化为0.在C中,未初始化的变量将包含垃圾。很可能你的char_index等于一些非常大的数字。

答案 2 :(得分:2)

除了其他人已经指出的内容之外,您还必须在final_line_num++;语句之后立即将行缓冲区分配调用移动到循环中。否则,您读取的每一行都将覆盖上一行。

答案 3 :(得分:0)

某些操作系统,如大多数符合POSIX标准的操作系统,特别是Linux,使您能够将文件段(可能是整个文件)映射到虚拟内存中。在Linux上,您可以考虑使用mmap system call