2012-03-20 24 views
0

プログラミング言語を含めるのを忘れています(これはC言語で記述する必要があります)。テキストファイルから整数を読み込み、別のテキストファイルとバイナリファイルにソートします

私はこのプログラムを行うのに助けが必要です。サンプルコードは非常に高く評価されます。

を含むファイルが読み込まれます。ソートされる整数の数。次に、 b。ソートされる整数(1行に1つの整数)(指定された整数の数と同じでなければならない)

このファイルは別のテキストファイルとバイナリファイルでソートされます。

その他スペック:

  1. 使用動的なメモリ割り当て
  2. 端末でフォーマットする必要があります:program.outプログラム自体である

    ./program.out original-file.txt output-file.txt output-file.bin 
    

original-file.txtテキストでありますソートされる整数の数とソートされていない整数を含むファイルとoutput-file.txtoutput-file.binにはソートされた整数が含まれています。

エラーチェック:

3 #number of integers to be sorted 
3 #the integers-separated by new line 
2 
1 

出力ファイル:

3 
1 
2 
3 

  1. のmalloc()が正常

返されたかどうかをチェックし、元のファイルは次のようになります

あらかじめありがとうございます:)神は祝福します!

+2

これまでに何を試しましたか? –

+0

どのプログラミング言語? – user1027167

+3

これは教科の割り当てのように私に見えます。それは...ですか? – deadlyvices

答えて

0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
struct tree { 
    int num, cnt; 
    struct tree *left, *right; 
}; 
struct tree *add(struct tree *t, int val) { 
    if (!t) { 
    if (!(t = malloc(sizeof(struct tree)))) 
     perror("Not enough memory"), exit(-1); 
    memset(t, 0, sizeof(struct tree)); 
    t->num = val; 
    ++t->cnt; 
    return t; 
    } 
    if (val < t->num) 
    t->left = add(t->left, val); 
    else if (val > t->num) 
    t->right = add(t->right, val); 
    else 
    ++t->cnt; 
    return t; 
} 
int walk(struct tree *t, int (*f)(struct tree *, void*), void *data) { 
    int rc; 
    if (!t) 
    return 0; 
    rc = walk(t->left, f, data); 
    rc += f(t, data); 
    rc += walk(t->right, f, data); 
    return rc; 
} 
struct tree *clean(struct tree *t) { 
    if (!t) 
    return NULL; 
    t->left = clean(t->left); 
    t->right = clean(t->right); 
    free(t); 
    return NULL; 
} 
int save(struct tree *t, void *data) { 
    int i, rc = 0; 
    FILE *fp = (FILE *) data; 
    for (i = 0; i < t->cnt; ++i) 
    rc += (fprintf(fp, "%d\n", t->num) < 0); 
    return rc; 
} 
int saveb(struct tree *t, void *data) { 
    int i, rc = 0; 
    FILE *fp = (FILE *) data; 
    for (i = 0; i < t->cnt; ++i) 
    rc += (fwrite((void *) &t->num, sizeof t->num, 1, fp) != 1); 
    return rc; 
} 
int main(int argc, char **argv) { 
    int rc = 0; 
    struct tree *t = NULL; 
    char buff[0x200]; 
    FILE *fin, *fout, *foutb; 
    if (argc < 4) { 
    fprintf(stderr, "Usage: %s SRCFILE OUTFILE.TXT OUTFILE.BIN\n", argv[0]); 
    exit(0); 
    } 
    if (!((fin = fopen(argv[1], "r")) && (fout = fopen(argv[2], "w")) 
     && (foutb = fopen(argv[3], "wb")))) { 
    perror("fopen"); 
    exit(-1); 
    } 
    while (fgets(buff, sizeof buff, fin)) 
    t = add(t, atoi(buff)); 
    rc += walk(t, save, (void *) fout); 
    rc += walk(t, saveb, (void *) foutb); 
    t = clean(t); 
    fclose(fin); 
    fclose(fout); 
    fclose(foutb); 
    return rc; 
} 

だけスペック「ファイルの最初の文字列の整数の数を」気づきました。私はあなたの先生がそれらを配列に並べて並べ替えると思います。しかし、とにかく自分でやってください:)

#include <stdio.h> 
#include <stdlib.h> 
int cmp(const void *a, const void *b) { 
    return *(int*)a > *(int*)b ? 1 : (*(int*)a < *(int*)b ? -1 : 0); 
} 
int main(int argc, char **argv) { 
    char buff[0x200]; 
    FILE *fin, *fout, *foutb; 
    int i, *arr, sz = 0, rc = 0; 
    if (argc < 4) { 
    fprintf(stderr, "Usage: %s SRCFILE OUTFILE.TXT OUTFILE.BIN\n", argv[0]); 
    exit(0); 
    } 
    if (!((fin = fopen(argv[1], "r")) && (fout = fopen(argv[2], "w")) 
     && (foutb = fopen(argv[3], "wb")))) { 
    perror("fopen"); 
    exit(-1); 
    } 
    if (fgets(buff, sizeof buff, fin)) { 
    sz = atoi(buff); 
    if (!(arr = malloc(sizeof(int) * sz))) 
     perror("Not enough memory"), exit(-1); 
    for (i = 0; i < sz && fgets(buff, sizeof buff, fin); ++i) 
     arr[i] = atoi(buff); 
    } 
    qsort(arr, sz, sizeof(int), cmp); 
    for (i = 0; i < sz; ++i) 
    rc += (fprintf(fout, "%d\n", arr[i]) < 0); 
    for (i = 0; i < sz; ++i) 
    rc += (fwrite((void *) &arr[i], sizeof(int), 1, foutb) != 1); 
    fclose(fin); 
    fclose(fout); 
    fclose(foutb); 
    return rc; 
} 
+0

ありがとうございました!私は今何をすべきか考えています。 :) 神のご加護を! – John

+0

アイデア? :)あなたがする必要があるのは、2番目のコードをコピーしてコンパイルすることだけです。実際にそれを読んで理解する時間があることを願っています。 –

+0

コピー&ペーストしたいのと同じくらい自分自身でコードを作成したい:))プログラムを実行しようとしたが、ソートする整数の数(上記の例では3)は出力ファイルに出力するには、どうすればよいですか? – John

0

ここにいくつかのサンプルコードがあります。これらの関数名のためにgoogleを使用していて、授業で目を覚ましていた場合は、うまくいくと確信しています。あなたはおそらくする必要があります

  • ファイルを開きます

    FILE* inFile = fopen("input.txt", "r");

  • は、いくつかのメモリを割り当てる入力から

    int numConverted = fscanf(inFile, "%d", &value);

  • を単一の値を読む:

    int *pInts = malloc(n * sizeof(int));

  • ソートアレイ

    // The parameters are tricky! Check your class notes or text book qsort(...)

  • fprintf(outFile, "%d\n", i);

  • がバイナリとして単一の値を書き出すテキストとして単一の値を書き出す:

    fwrite(&i, sizeof i, 1, outBinFile);

+0

ありがとうございました! :) – John