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

时间:2021-03-11 22:20:42

标签: c file io fgets

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

我不确定我是否为这个数组正确分配了空间。我的 fgets() 函数中的 read_one_line() 出现分段错误。

我的代码:

#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;
}

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

在函数read_one_line中,sizeof(line)不对,line是指针,你不会得到容器line的大小,而是获取容器的大小指针本身(可能是 8 个字节),您需要将容器的实际大小作为函数的参数传递并在 fgets 中使用它。

答案 1 :(得分:0)

嗯。

lines[*num_lines] 将是您分配的行数组末尾的一个。您正在指示 fgets 读入未分配的内存。在您的 read_lines 函数中修复该问题。

答案 2 :(得分:0)

就是这样完成的(原型制作)

FILE* f = fopen();
int result;
int n = 0;
int b = 0;
int bh = 0;

do
{
   int a;
   b++;
   fscanf(f,"%*[^\n]%n%*c" , &a);
   n = MAX(n,a);
} while (feof(f) == false);
n++;
char *x = calloc(n*b , sizeof(char));
rewind(f);
do
{
   fscanf(f,"%[^\n]%*c",&x[0][bh]);
   bh++;
} while (bh < b);

找到并复制粘贴 max 的代码。 #include sys/param.h 在 linux 中,msvc 中也有一个