【发布时间】:2015-06-01 10:55:19
【问题描述】:
我有一个关于在文件中的字符串上实现快速排序的问题。
这个练习需要输入你要打开的文件的文件名,最多可以有100个项目。使用函数char filling(FILE* myfile),文件中包含的每一行都通过一个while循环复制到一个数组中,该循环在文件末尾结束。
然后调用函数sort(strings, start, end, leq)对字符串数组进行排序,在函数结束时,将复制到一个名为sorted_myfile的新文件中。
我的问题是:如何测试我的程序是否适用于文件?
在函数char filling 中,声明leq_fn leq 是指声明指向函数typedef bool(* leq_fn )(char *, char *) 的指针,它包含在快速排序的函数中。我希望我给了你所有你需要的信息来帮助我。谢谢你。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "quicksort.h"
#define MAX_LENGTH 100
#define EXTRA_LENGTH 101
#define LENGTH_STRING 255
char filling(FILE *myfile);
char *strings[MAX_LENGTH]; //Array of at most 100 items
char filling(FILE *myfile){
char *row;
char new_filename[LENGTH_STRING];
FILE* sorted_myfile;
int i=0, start=0, end=MAX_LENGTH-1;
bool res_cmplen, res_cmpalpha, res_cmpalpha_nocase;
FILE *sorted_myfile;
while(i<=EOF){
if(i==EXTRA_LENGTH){
printf("The file has more than 100 items\n");
}else{
row = calloc(LENGTH_STRING, sizeof(char));
fgets(row, LENGTH_STRING, myfile);
strings[i]=row;
i++;
free(row);
}
}
leq_fn leq;
leq = cmp_len;
res_cmplen = (*leq)("hello", "bye");
leq = cmp_alpha;
res_cmpalpha = (*leq)("HELLO", "bye");
leq = cmp_alpha_nocase;
res_cmpalpha_nocase = (*leq)("hello", "BYE");
sort(strings, start, end, leq);
scanf("%s", new_filename);
sorted_myfile = fopen(new_filename, "w");
for(i=0;i<end;i++){
fputs(strings[i], sorted_myfile);
}
return 0;
}
int main(void) {
char filename[LENGTH_STRING];
FILE *myfile;
printf("What is the file name?\n");
scanf("%s", filename);
myfile = fopen(filename, "r");
if(ferror(myfile)!=0){
printf("The file doesn't exist\n");
}else{
filling(myfile);
}
return 0;
}
【问题讨论】:
-
在
filling函数中,循环不会被迭代一次。宏EOF通常定义为-1,而0 <= -1永远不会为真。另外,要检查文件是否正确打开,需要检查返回的指针是否为NULL,而不是调用ferror,除了文件不存在之外,可能还有很多其他问题。 -
@JoachimPileborg 所以在 while 循环中,变量 i 将被初始化为 -1?
-
另外,你的代码中有未定义的行为,你首先使用
calloc分配内存,复制指针(但不是指针指向) 然后释放刚刚分配的内存,让指针指向未分配的内存。以任何方式使用该指针都会导致未定义的行为。 -
不,当
i小于MAX_LENGTH(strings数组的大小)时,您应该循环。 并且还检查fgets返回的内容,因此一旦到达文件末尾就不会进行迭代。 -
程序的工作目录和文件所在的目录一样吗?如果您使用某种 IDE(集成开发环境),那么您应该检查项目设置以确保。