2015-10-15 4 views
0

Мне нужно написать программу на C и прочитать ее текстовый файл ввода, который я создал и вывести в выходной файл, и показать исходные номера, а затем отсортировать их. У меня большая часть работы, но это дает мне ошибку при попытке пройти мимо определенного номера, просто прочитав исходный ввод. Вот мой код:Сортировка чисел в текстовом файле

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

//function prototypes 

void sortNumbers(int *num, int count); 

void swap(int *nums, int i, int j); 

//main function 

int main(int argc, char *argv[]) 

{ 

//declare the variables 

int *numbers; 

int count = 0, i = 0; 

char input[20], output[20]; 

FILE *fileIn, *fileOut; 

//allocate the default size of array to maximum of 100 

numbers = (int *)malloc(sizeof(int)); 

//check the number of arguments at command line 

if (argc < 2) 

{ 

     printf("Please provide the input and output text file names as ./a.out name1 name2 \n"); 

     return 0; 

} 

//read the file names from command line 

else 

{ 

     sscanf(argv[1], "%s", input); 

     sscanf(argv[2], "%s", output); 

} 

//open the files 

fileIn = fopen(input, "r"); 

fileOut = fopen(output, "w"); 

//condition to check whether the input file and output 

//file are able to open or not. If not print the error message 

if (fileIn == NULL) 

{ 

     printf("Input file %s cannot be opened.\n", input); 

     return 0; 

} 

else if (fileOut == NULL) 

{ 

     printf("Output file %s cannot be opened. \n", output); 

     return 0; 

} 

//read the data from the file 

else 

{ 

     fscanf(fileIn, "%d", &numbers[i]); 

     printf("%d\n", numbers[i]); 

     fprintf(fileOut, "%d\n", numbers[i]); 



     while (!feof(fileIn)) 

     { i++;  

      numbers = (int *)realloc(numbers,(i)*sizeof(int)); 

      fscanf(fileIn, "%d", &numbers[i]); 

      printf("%d\n", numbers[i]); 

      fprintf(fileOut, "%d\n", numbers[i]);          

     } 

} 

count = i; 

//close the files 

fclose(fileIn); 



printf("\n"); 

//sort the elements in the array 

sortNumbers(numbers, count); 

fprintf(fileOut,"\nElements after sorting are: \n"); 

printf("\nElements after sorting are: \n"); 

//print the elements to the console and to the 

//output file 

for(i=0;i<count;i++) 

{ 

     fprintf(fileOut,"%d \n", numbers[i]); 

     printf("%d \n", numbers[i]); 

} 

fclose(fileOut); 

return 0; 

} 

//sort algorithm using selection sort 

void sortNumbers(int *num, int count) 

{ 

for (int i = 0; i < count; ++i) 

{ 

     int minIndex = i; 

     for (int j = i + 1; j < count; ++j) 

     { 

      if(num[j]<num[minIndex]) 

       minIndex = j; 

     } 

     swap(num, minIndex, i); 

} 

} 

//swap function 

void swap(int *nums, int i, int j) 

    { 

int temp = nums[i]; 

nums[i] = nums[j]; 

nums[j] = temp; 

} 
+0

PLS формат вашего кода – Les

ответ

2

i начал как ноль, и вы выделили 1, вы должны перераспределить + 1. По мере того, как ваша программа стоит, вы будете читать в пространстве памяти за пределами того, что вы выделили. Кроме того, счетчик не равен i. i - это индекс, который работает от 0 до 1 меньше, чем число в вашем массиве. Установка количества до i сделает его на один меньше фактического.

+0

Это именно то, что мне нужно. Благодаря! – Joe

0

Вы назначаете i ints в numbers, но вы получаете доступ к элементу i. Это вызывает ошибку доступа к памяти. Изменение перераспределить на:

numbers = (int *)realloc(numbers,(i+1)*sizeof(int));

1

Я вижу несколько проблем в вашей программе:

  1. вашей логики для чтения и подсчета числа успешно считаны номера неправильно. Он будет отключен на 1.

  2. Вы назначаете одно меньшее требуемое количество объектов в вызове realloc.

Я хотел бы заменить содержимое окончательного else {} блока с:

else 
{ 
    while (fscanf(fileIn, "%d", &numbers[i]) == 1) 
    { 
     printf("%d\n", numbers[i]); 
     fprintf(fileOut, "%d\n", numbers[i]); 
     ++i; 
     numbers = realloc(numbers,(i+1)*sizeof(int)); 
    } 
} 

Также см Why is “while (!feof (file))” always wrong?.

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