我无法逐行读取文件中的文本并将每一行存储到数组中。然后我需要打印出我得到的数组。
我不确定我是否为这个数组正确分配了空间。我的 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;
}
非常感谢您的帮助!
答案 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 中也有一个