我必须用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 :(得分:2)
i
从零开始,你分配了1,你应该重新分配i + 1。当你的程序站立时,你将读入超出你分配的内存空间。此外,计数不等于i。 i
是一个索引,它比数组中的计数小0到1。将计数设置为i
将使其小于实际大小。
答案 1 :(得分:1)
我在你的程序中看到了几个问题:
您读取和计算成功读取数字的逻辑是错误的。它会被1点关闭。
您在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));
}
}
答案 2 :(得分:0)
您已将ints
分配到numbers
,但您正在访问i
元素。这会导致内存访问错误。将您的realloc更改为:
numbers = (int *)realloc(numbers,(i+1)*sizeof(int));