2014-02-05 5 views
0

Я работаю над программой на языке C для класса, и я застрял. Я изучаю всюду (учебники, Интернет, одноклассники, заметки класса), и я не могу найти проблему. Вот следующее назначение:Чтение и запись в текстовые файлы с использованием массивов

Напишите функцию, которая считывает входной файл и создает отсортированный выходной файл. Прототипом функции является void file_sort (char * infile, char * outfile). Функция принимает имена файлов в качестве параметров. Входной файл содержит информацию о студенте и имеет следующий формат. Первая строка содержит количество студентов в файле. Каждая последующая строка содержит информацию об одном ученике. Каждая строка содержит три поля: идентификатор студента, класс и GPA в этом порядке, разделенные пробелами. Идентификатор студента - положительное целое число. Класс - персонаж. GPA - это значение двойного типа. Функция сортирует информацию о студенте в порядке возрастания идентификатора студента. Информация о заказе студента записывается в выходной файл. Выходной файл имеет тот же формат, что и входной файл. Функция динамически распределяет три массива и сохраняет информацию о студенте в массивы. Одновременно сортируются три массива. Информация отсортированного массива записывается в выходной файл. Динамические массивы освобождаются, когда функция завершает свою работу. Структуры не должны использоваться.

Всего несколько нот: (1) Я программировал на языке Java примерно 3 года. Программирование для меня не обязательно нова. Однако язык C. (2) Если я не представил надлежащим образом свой вопрос, вы можете, конечно, сказать это, но, пожалуйста, будьте внимательны. В конце концов, я все еще считаю себя «новичком».

Вот мой текущий код. Первый блок - это мое вызов функции file_sort() в main. Он управляется меню (для пользователя доступны 1-11 вариантов. Это вариант 9).

else if (response == 9) 
    { 
     char *input_file_name; 
     char *output_file_name; 
     printf("Enter input file name: "); 
     scanf("%s", input_file_name); 
     printf("Enter output file name: "); 
     scanf("%s", output_file_name); 
     file_sort(input_file_name, output_file_name); 
     printf("File sorted and rewritten\n"); 
    } 

Это функция, объявленная за пределами основного.

void file_sort(char *infile, char *outfile) 
{ 
    FILE *input; 
    FILE *output; 
    input = fopen(infile, "r"); 
    output = fopen(outfile, "w"); 
    int size = 100; 
    int *id_array; 
    id_array = (int*)malloc(size*sizeof(int)); 
    char *grade_array; 
    grade_array = (char*)malloc(size*sizeof(char)); 
    double *gpa_array; 
    gpa_array = (double*)malloc(size*sizeof(double)); 
    char grade; 
    int id; 
    double gpa; 
    int number_students, j; 
    if (input == NULL) 
    { 
     printf("File could not be opened\n"); 
    } 
    fscanf(input, "%d", &number_students); 
    while ((fscanf(input,"%d %c %lf", &id, &grade, &gpa)) == 3) 
    { 
     j = number_students; 
     while((j >= 0) && (id_array[j] > id)) 
     { 
      if (id_array[0] == 0) 
      { 
       id_array[0] = id; 
       break; 
      } 
      id_array[j + 1] = id_array[j]; 
      j--; 
     } 
     if (j < 0) 
     { 
      j = 0; 
     } 
     id_array[j] = id; 
     gpa_array[j] = gpa; 
     grade_array[j] = grade; 
    } 

    int i; 
    for (i = 0; i <= number_students; i++) 
    { 
     fprintf(output, "%d %c %lf\n", id_array[i], grade_array[i], gpa_array[i]); 
    } 
    free(id_array); 
    free(grade_array); 
    free(gpa_array); 
    fclose(input); 
    fclose(output); 
} 

Если есть какая-либо информация, которую я должен включить, чтобы лучше ответить на этот вопрос, пожалуйста, дайте мне знать. Большое спасибо.

похоже, что сортировка не работает. Ниже я опубликовал файл, который нужно сортировать вместе с окончательным результатом.

Чтобы отсортировать (первый номер объявляет количество студентов):

5 
6029 A 3.5 
3920 B 2.3 
9287 A 3.1 
1029 C 1.7 
8391 B 2.9 

файл "несортированные" после запуска:

1029 C 1.700000 
8391 B 2.900000 
9287 £ 0.000000 
9287 0.000000 
10696720 ¸ 0.000000 
10696720 0.000000' 

???

+1

Уточните вопрос и четко определите свою проблему ??? – Jeyaram

+0

Что сказал @Jeyaram. Я понятия не имею, каков ваш вопрос. –

+0

Уточнение вопроса: Когда я скомпилирую эту программу (в CodeBlocks с использованием компилятора GCC), я получаю 0 ошибок. Однако после того, как я введу какой файл, который я хочу прочитать, и запись в программу, похоже, сбой. Я получаю сообщение, в котором говорится, что «Assignment.exe перестала работать». Windows ищет решение проблемы, но никогда не находит ее. Как только программа завершается, ни одно сообщение об ошибке не отображается. Проясняет ли это? Я не могу поверить, что забыл на самом деле задать свой вопрос ... –

ответ

0

Я не уверен в точной проблеме.

один видимый вопрос находится в разделе else if (response == 9)

char *input_file_name; 
char *output_file_name; 

являются символьными указателями. Эти указатели использовали для получения имен файлов. Но для этого не выделяется память.

else if (response == 9) 
    { 
     char *input_file_name; <------ 
     char *output_file_name; 
     printf("Enter input file name: "); 
     scanf("%s", input_file_name);<-------------- 
     printf("Enter output file name: "); 
     scanf("%s", output_file_name);<-------------- 
     file_sort(input_file_name, output_file_name); 
     printf("File sorted and rewritten\n"); 
    } 

Либо распределить динамически, либо сделать его как массив символов.

char input_file_name[50]; 
char output_file_name[50]; 
+0

Ничего себе, я совершенно не думал об этом. Как только я выполнил ваше предложение, файл был прочитан, и новый файл был создан с новыми данными. Однако сортировка была выполнена некорректно. Я буду смотреть на следующее, поскольку я могу найти эту ошибку. Ваша помощь приветствуется. –

+0

Похоже, что сортировка не работает. Ниже я опубликовал файл, который нужно сортировать вместе с окончательным результатом. Для того, чтобы быть отсортированы (первый номер объявляет количество студентов): '5 6029 3,5 3920 B 2,3 9287 A C 1.7 8391 B 2,9 3,1 1029' файл "Сортировка" после запуска: ' +1029 С 1,700000 8391 Б 2,900000 9287 £ 0,000000 0,000000 10696720 ¸ 0.000000 0.000000' ??? –

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