Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于我的C代码,我读取一个文件并对其进行排序,这给了我垃圾输出。为什么?_C_Arrays_File_Loops - Fatal编程技术网

对于我的C代码,我读取一个文件并对其进行排序,这给了我垃圾输出。为什么?

对于我的C代码,我读取一个文件并对其进行排序,这给了我垃圾输出。为什么?,c,arrays,file,loops,C,Arrays,File,Loops,我正在做一项任务,这是: 查找文件中最大的k个元素。分配一个大小为k的数组,当您从文件中读取数字时,将k个最大的数字存储在数组中。从文件中读取下一个元素时,查找是否需要修改数组。假设下一个读取的元素为80。由于80大于最小的元素,我们需要将

我正在做一项任务,这是: 查找文件中最大的k个元素。分配一个大小为k的数组,当您从文件中读取数字时,将k个最大的数字存储在数组中。从文件中读取下一个元素时,查找是否需要修改数组。假设下一个读取的元素为80。由于80大于最小的元素,我们需要将<80的元素向右移动1个位置,并为80创建空间。在main()中,使用argc和argv从用户处读取文件名和k,并计算和打印k个最大元素。程序名assign3.c第一个参数是filename,第二个参数是k。您需要在stdlib.h中使用atoi()将字符串转换为整数

我的问题是我正在获取arr和排序arr的垃圾值

#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,否则返回0

fscanf
返回已成功解析的元素数,使用
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是的,你是正确的,但就我所见,它适用于大多数情况。