从文件中读取行并将其存储在数组中

2024-03-08

我无法从文件中逐行读取文本并将每一行存储到数组中。然后我需要打印出我得到的数组。

我不确定是否为该数组正确分配了空间。我收到来自以下位置的分段错误fgets() in my read_one_line()功能。

My code:

#include <stdio.h>
#include <stdlib.h>
char* read_one_line(FILE* fp, char* line);
char* allocate_mem(FILE* fp, char* line);
void print_lines(char** lines, int num_lines){
    int i;
    for(i = 0 ; i < num_lines; ++i){
        printf("%d. %s", i+1, lines[i]);
    }
}
void free_lines(char** lines, int num_lines){
    int i;

    for(i = 0 ; i < num_lines; ++i){
        free(lines[i]);
    }

    if(lines != NULL && num_lines > 0){
        free(lines);
    }
}
FILE* validate_input(int argc, char* argv[]){

    FILE* fp = NULL;

    if(argc < 2){
        printf("Not enough arguments entered.\nEnding program.\n");
        exit(0);
    }
    else if(argc > 2){
        printf("Too many arguments entered.\nEnding program.\n");
        exit(0);
    }

    fp = fopen(argv[1], "r");

    if(fp == NULL){
        printf("Unable to open file: %s\nEnding program.\n", argv[1]);
        exit(0);
    }
    return fp;
}
void read_lines(FILE* fp, char*** lines, int* num_lines) {
  *num_lines = 0;

  do {
    *num_lines += 1;
    *lines = malloc(*num_lines * sizeof(*lines));
    for(int i = 0; i < *num_lines; ++i) {
      *lines[i] = allocate_mem(fp, *lines[i]);
    }
    read_one_line(fp, *lines[*num_lines]);
  } while(read_one_line(fp, *lines[*num_lines]) != NULL);
}
char* read_one_line(FILE* fp, char* line) {
  fgets(line, sizeof(line), fp);
  return line;
}
char* allocate_mem(FILE* fp, char* line) {
  fseek(fp, 0, SEEK_END);
  int length = ftell(fp);
  fseek(fp, 0, SEEK_SET);
  line = malloc((length + 1) * sizeof(char));
  return line;
}
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_one_line, sizeof(line)是不正确的,line是一个指针,你不会得到容器的大小line,但是指针本身的大小(可能是 8 个字节),您需要将容器的实际大小作为函数的参数传递,并在fgets.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从文件中读取行并将其存储在数组中 的相关文章