【发布时间】:2016-07-27 03:24:51
【问题描述】:
所以我想创建一个基本的 C 应用程序mysort,它获取文件列表,将每个文件逐行读取到缓冲区中,并按字母顺序对行进行排序。代码看起来像这样(加上参数解析等):
//How do I initialize an array of 1024byte-Strings with an unknown amount of fields?
char** lines;
int lineNum = 0;
for(int num_files = j; num_files < argc; num_files++){ //iterate through all files
FILE * filepointer ;
char * line = NULL;
size_t len = 0;
ssize_t read;
filepointer = fopen(argv[num_files], "r");
if (filepointer == NULL)
exit(EXIT_FAILURE);
//TODO: write each line into a new spot of the array, this try doesn't work!
while ((read = getline(&line, &len, filepointer)) != -1) {
//the lines may be assumed to be a max of 1024 bytes
lines[lineNum] = malloc(1024 * sizeof(char));
//lines[lineNum] = line;
strcpy(lines[lineNum], line);
lineNum++;
}
fclose(fp);
if (line)
free(line);
//These values might be wrong, but that isn't the issue I'm adressing
//just for illustration
qsort(lines , argc - 1, sizeof(char *), cmpstringp)
//do something with the sorted lines
}
因为我必须使用qsort(3),所以我需要生成一个char**,在某个时刻保存所有行。
有什么好的方法可以完成这样的任务?我是否需要自己的数据结构来动态存储多个相同的对象?
lines char** 数组在这里没有初始化,所以程序不工作。但是由于在程序开始时行数是完全未知的,它可能没有明确定义(除非你知道一个聪明的函数来解决这个问题)
到目前为止,我想出的唯一方法是定义我自己的动态数据结构(例如 LinkedList)或解析所有文件两次以确定将产生的行数。
在我看来,两者都不太优雅,但也许我只是不习惯 C 代码。
【问题讨论】:
-
for "lines[lineNum] = line;"你应该使用 strcpy 来代替
-
lines[lineNum] = malloc(...);lines[] 此时仍未初始化。 -
您的数据结构会是一个更好的主意,但更快的解决方案是两次读取文件,第一次发现行数,第二次用于填充变量
-
行只是一个指针数组,从某个大小开始,当你达到容量时重新分配/增长它
-
@BeyelerStudios 这有效地实现了一个 ArrayList。我只是想知道 C 是否提供了一些方便的方法来做我想做的事情。