对于我的C代码,我读取一个文件并对其进行排序,这给了我垃圾输出。为什么?
我正在做一项任务,这是: 查找文件中最大的k个元素。分配一个大小为k的数组,当您从文件中读取数字时,将k个最大的数字存储在数组中。从文件中读取下一个元素时,查找是否需要修改数组。假设下一个读取的元素为80。由于80大于最小的元素,我们需要将<80的元素向右移动1个位置,并为80创建空间。在main()中,使用argc和argv从用户处读取文件名和k,并计算和打印k个最大元素。程序名assign3.c第一个参数是filename,第二个参数是k。您需要在stdlib.h中使用atoi()将字符串转换为整数 我的问题是我正在获取arr和排序arr的垃圾值对于我的C代码,我读取一个文件并对其进行排序,这给了我垃圾输出。为什么?,c,arrays,file,loops,C,Arrays,File,Loops,我正在做一项任务,这是: 查找文件中最大的k个元素。分配一个大小为k的数组,当您从文件中读取数字时,将k个最大的数字存储在数组中。从文件中读取下一个元素时,查找是否需要修改数组。假设下一个读取的元素为80。由于80大于最小的元素,我们需要将
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
int main(int argc, char *argv[])//
{
FILE *iFile;//file pointer
int i = 0, n, temp = 0, count = 0, j;
int k = atoi(argv[1]);//convert strings into int
int *arr = (int *)malloc(k * sizeof(int));////allocate an array of size k
iFile = fopen("a.txt", "r");//opens file
if (iFile == NULL)
return -1;
while (feof(iFile) <= 0)
{
fscanf(iFile, "%d", arr);
printf("arr= %d\n", arr);
count = count++;
for (i = 0; i < count; i++) //Loop for descending ordering
{
for (j = 1; j <= count; j++) //Loop for comparing other values
{
if (arr[j] < arr[i]) //Comparing other array elements
{
temp = arr[i]; //Using temporary variable for storing last value
arr[i] = arr[j]; //replacing value
arr[j] = temp; //storing last value
}
}
}
}
for (i = 0; i < k + 1; i++)
printf("sorted arr is =%d\n", arr[i]);
fclose(iFile);
free(arr);
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])//
{
FILE*iFile;//文件指针
int i=0,n,temp=0,count=0,j;
int k=atoi(argv[1]);//将字符串转换为int
int*arr=(int*)malloc(k*sizeof(int));///分配一个大小为k的数组
iFile=fopen(“a.txt”,“r”);//打开文件
如果(iFile==NULL)
返回-1;
while(feof(iFile)使用这样的while循环条件
而(!feof(iFile))
feof()检查是否已到达文件末尾并返回0,否则返回0fscanf
返回已成功解析的元素数,使用while(fscanf(iFile,“%d”,&arr[i])!=1)
如果我理解正确,您必须从包含任意数N个整数的文件中读取最大k个整数,并且您要问如何找出N的值?N的值与问题无关。无论N有多大,您只需读取文件一次。不要直接读取数组;请使用一个临时变量。将其与迄今为止读取的最小值进行比较。如果它更大,并且您尚未读取k值,请将其粘贴到当前位置的数组中(您也在跟踪该位置)。读取k个值后,如果读取的值大于目前为止的最小值,请转储最小值,添加新值,并对数组进行排序。选择新的最小值,然后继续,直到到达文件末尾。请不要修改代码。这会使以前的所有注释和答案都无效。没有人希望以移动为目标目标。如果您对代码进行修改,可以将其作为新版本添加,但不应删除初始代码。@Gerhardh对此表示抱歉。从现在起,我将在新代码的末尾保留对旧代码的注释。为什么“while(!feof(file))”总是错误的?-`“当文件指针(iFile)出现时,循环将中断”已到达文件的结尾。在这种情况下,feof(iFile)返回1,因此!feof(iFile)将为0,因此将中断循环。如@MayurK said feof(),只检查是否已看到文件结尾标记-对于任何其他类型的结束条件(包括文件没有of文件标记)它不做任何操作永远不要使用feof作为循环条件-始终使用检查成功读取的内容。@jerry是的,你是正确的,但就我所见,它适用于大多数情况。