2012-03-20 15 views
0

Я забыл включить язык программирования (он должен быть на языке C).Прочитайте целые числа из текстового файла и отсортируйте их в другом текстовом файле и двоичном файле

Мне нужна помощь в выполнении этой программы. Образец кода будет с благодарностью оценен.

Программа читает файл, содержащий:

а. количество целых чисел, подлежащих сортировке, а затем b. целые числа, подлежащие сортировке (одно целое число на строку) (должно совпадать с указанным числом целых чисел).

Затем он будет отсортирован в другом текстовом файле и двоичном файле с самого низкого до самого высокого.

Другие характеристики:

  1. Использование динамической памяти распределение
  2. Формат в терминале должен быть:

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

где program.out является сама программа, original-file.txt текст файл, который содержит количество целых чисел, подлежащих сортировке, и несортированные целые числа и output-file.txt и output-file.bin содержит отсортированные целые числа.

проверка

Ошибка:

  1. проверить, если таНос() был возвращен успешно

исходный файл будет выглядеть следующим образом:

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

выходной файл:

3 
1 
2 
3 

Большое вам спасибо :) God Bless!

+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

Идея? :) Все, что вам нужно сделать, это скопировать второй код и скомпилировать его :) Надеюсь, у вас будет время, чтобы действительно прочитать и понять. –

+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

Смежные вопросы