0

ファイルから文字列を読み取り、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

ただし、私のコードはまったく機能していません。比較メソッドが正しい結果を返すことを確認しました。さらに、malloc-realloc を正しく実装しているかどうか疑問に思っています。どうも

4

3 に答える 3

1

文字列を出力したいので、次のように置き換えます。

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

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

しかし、コードに他の問題があるかもしれません..

于 2013-02-07T18:09:06.317 に答える
0

ああ、あなたのコードにはたくさんのエラーがあります。

この小さな例を参照してください(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()可変長配列を使用します。この方法では、コードははるかに単純です。

于 2013-02-07T18:17:56.623 に答える
0

まず第一にmmap(2)、ファイルをメモリーに入れるだけで、苦労して読み込まないほうがよいかもしれませんが、まあまあです。

malloc(3)およびその同類の結果をキャストしないでください。不必要な、間違いを隠すかもしれません。

qsort(3)配列 (固定サイズの要素) を並べ替えます。のような配列を作成char *line[]し、各要素がそれぞれの行を指すように設定します。私のqsort(3)マニュアルページ(Linuxのマニュアルページから)には、まさにこれを行う例があります。

于 2013-02-07T18:14:30.010 に答える