readlines函数可将文件中的文本逐行插入到指针传递的字符串数组中

时间:2019-06-03 01:41:02

标签: c

我正在尝试创建一个函数read_lines,该函数需要一个文件* fp,一个指向char **行的指针以及一个指向int num_lines的指针。该函数应将文本的每一行插入行中,并将num_lines增加到文件具有的行数。

它可能真的很简单,但是我已经尝试插入文本几个小时了。

这是main.c的外观。除了read_lines之外的所有东西都已经定义并且可以工作了。该文件可以有任意数量的行,制表符,甚至可以只是换行符。

(这是一项家庭作业,因此main.c和函数声明必须保持相同)

int main(int argc, char* argv[]){

    char** lines = NULL;
    int num_lines = 0;
    FILE* fp = validate_input(argc, argv);
    read_lines(fp, &lines, &num_lines);
    print_lines(lines, num_lines);
    free_lines(lines, num_lines);
    fclose(fp);

    return 0;
}

这是我尝试添加行的尝试之一,但我无法弄清楚。

read_lines.c

void read_lines(FILE *fp, char ***lines, int *num_lines) {
    int i;
    int N = 0;
    char s[200];
    for (i=0; i<3; i++)
    {
        while(fgets(s, 200, fp)!=NULL){N++;}
        char strings[50][200];

        rewind(fp);
        fgets(s, 200, fp);
        strcpy(lines[i],s);
    }

}

感谢您为解决此问题提供的帮助。

1 个答案:

答案 0 :(得分:1)

读取时,需要为每行动态分配内存。这是通过mallocrealloc函数完成的。 malloc分配内存,realloc调整分配大小。

下面的代码应该做您想要的(我还没有对其进行广泛的测试),但是省略了错误检查,这是一个好习惯。

void read_lines (FILE *fp, char ***lines, int *num_lines) {
    // Initialize you number of lines variable
    *num_lines = 0;

    //Initialize the lines pointer
    // NO ERROR CHECKING DONE HERE
    *lines = malloc(sizeof(char*));

    // create a fixed size buffer for reading from file
    char s[200];

    // Read from the file using fgets
    while (fgets(s, 200, fp) != NULL) {
        // THIS CODE ASSUMES ALL LINES ARE LESS THAN 200 CHARACTERS
        // The memory to hold the line of text needs to be allocated
        int length = strlen(s);
        // Ensure there is space for the terminating null character
        (*lines)[*num_lines] = malloc(sizeof(char) * (length + 1));
        // The line needs to be copied from the buffer to the allocated memory
        strcpy((*lines)[*num_lines], s);

        // increment number of lines variable
        *num_lines++;

        // allocate space for another line in advance
        *lines = realloc(*lines, sizeof(char*) * ((*num_lines) + 1));
    }

    // There will be an extra line pointer allocated in the loop
    // Shrink the allocation to the appropriate size
    *lines = realloc(*lines, sizeof(char*) * (*num_lines));
}