我正在尝试创建一个函数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);
}
}
感谢您为解决此问题提供的帮助。
答案 0 :(得分:1)
读取时,需要为每行动态分配内存。这是通过malloc和realloc函数完成的。 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));
}