使用qsort在C中输出一个已排序的文件

时间:2013-02-07 18:05:18

标签: c

从文件中读取字符串并使用qsort打印已排序的输出。所以我写了这样的话:

int main()
{
  int n=0;
  int size=1;
  File *fp = fopen(args[0],"r");
  int c;
  char* inputFile;
  inputFile = char* malloc(size);
  if(fp==0){
    fprintf(stderr, "Cannot open file!\n");
    return -1;
  else{
    do{
      c = fgetc(fp);
      if(size==1){
        inputFile[n]=c;
      }
      else{
        inputFile = char* realloc(inputFile, size+1);
        inputFile[n]=c;
      }
      n++;
      size++;
  }while(c!=EOF);
  qsort(inputFile, 1, size, compare);//I have implement the compare function correctly
  n=0;
  while(n<size){
    while(input[n]!='\0'){
       printf ("%d ",inputFile[n]);
       n++;
    }
    n++;
  }
  return 0;
}

所以,如果输入文件是'\ 0vaaa \ n \ 0ba \ 0 \ nabc',程序应输出print:

abc
ba
vaaa

但是,我的代码根本不起作用。我检查了compare方法返回正确的结果。另外,我只是想知道我是否正确实现了malloc-realloc? THX

3 个答案:

答案 0 :(得分:1)

您想要打印字符串,请替换:

printf ("%d ",inputFile[n]);

printf ("%s ",inputFile[n]);

但您的代码中可能还有其他问题..

答案 1 :(得分:0)

首先,将文件mmap(2)放入内存可能更好,而不是痛苦地读取它,但是哦。好吧。

不要投射malloc(3)及其同类的结果。没有人,可能会掩盖错误。

qsort(3)对数组进行排序(固定大小的元素)。创建一个类似char *line[]的数组,进行设置,使每个元素指向相应的行。我的qsort(3)手册页(来自Linux手册页)有一个例子正是这样做的。

答案 2 :(得分:0)

Gah,我发现您的代码中存在很多错误。

请参阅此 small 示例(与C99编译器兼容)。请注意,这只是您的计划的一部分。我没有使用qsort

#include <stdio.h>

int main(int argc, char **argv)
{
  int i, length;
  int j = 0;
  FILE *f = fopen("nullfile.bin","r");
  while((i = fgetc(f)) != EOF) j++;
  rewind(f);
  int array[j];
  length = j;
  j = 0;
  while((i = fgetc(f)) != EOF)
    array[j++] = i;
  fclose(f);
  for(i = 0; i < length; i++){
    if(array[i] == '\0') { printf("\n"); continue; }
    printf("%c", array[i]);
  }
  return 0;
}

我完全摆脱malloc()并使用可变长度数组。这种代码更加简单。