Работа с аргументами командной строки, stream!=null - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Пишу прогу, которая будет принимать в качестве аргументов командной строки текстовые файлы, брать из них числа и выводить по порядку. Выскакивает ошибка: stream!=null Что можно сделать?
#include <stdio.h>
#include <stdlib.h>

void print(FILE ** files,char * argv[],int argc)
{
    double * input = NULL;
    double min=0;
    int i=0;
    int minnum=0;
    //открывание файлов
    input = (double *)calloc(argc-1, sizeof(double));
    for(i = 0; i <argc-1; i++)
    {
        files[i] = fopen(argv[i + 1], "r");
        if(NULL == files[i])
        {
            printf("File \"%s\" not found\n",argv[i + 1]);
        }
    }
    //проверка
    for(i=0;i<argc-1;i++)
    {
        if(fscanf(files[i], "%lf ", &input[i])==EOF)
        {
            fclose(files[i]);
            files[i] = NULL;
            printf("File \"%s\" ruturn -1\n",argv[i+1]);
            continue;
        }
    }
    //вывод
    while(1<2)
    {
        for(i=0;i<argc-1;i++)
        {
            if(NULL!=files[i])
            {
                if(input[i]<input[minnum])
                {
                    minnum = i;
                }
            }
        }
 
        if(EOF == minnum)
        {
            break;
        }
 
        printf("%lf\n", input[minnum]);
 
        min=input[minnum];

        if(EOF == fscanf(files[minnum], "%lf", &input[minnum]))
        {
            fclose(files[minnum]);
            files[minnum] = NULL;
            continue;
        }
 
        else
        {
            if(min>input[minnum])
            {
                printf("File \"%s\" not valid.\n",argv[minnum+1]);
                fclose(files[minnum]);
                files[minnum] = NULL;
            }
        }
    }
}

int main(int argc, char * argv[])
{
    FILE **files=NULL;
    int i=0;
    int filecount=0;
    files=(FILE **)calloc(argc,sizeof(FILE *));
    print(files,argv,argc);
}
PS free() не хватает, но это не проблема на данном этапе

Решение задачи: «Работа с аргументами командной строки, stream!=null»

textual
Листинг программы
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
 
void scan(FILE ** files,char * argv[],int argc)
{
    int i=0;
    for(;i<argc-1;i++)
        files[i]=fopen(argv[i+1],"r");
 
}
void print(FILE ** files,char * argv[],int argc)
{
    double * input = NULL;
    double min=0;
    int i=0;
    int imin=-1;
    int fileqty=argc-1;
    int check=1;
    int scanfreturn=0;
    int scanfreturn2=0;
    int ti=0;
    int k=0;
    input=(double *)calloc(argc-1,sizeof(double));
    //проверка
    for(;i<argc-1;i++)
    {
        if(NULL!=files[i])
        {
            scanfreturn=fscanf(files[i], "%lf ", &input[i]);
            if(EOF==scanfreturn)
            {
                fclose(files[i]);
                files[i] = NULL;
                printf("\"%s\" empty\n",argv[i+1]);
                fileqty--;
                continue;
            }
        }
        else
        {
            printf("\"%s\" not found\n",argv[i+1]);
            fileqty--;
        }
    }
    if(fileqty==0)
        return;
    do
    {
 
        //поиск минимума
        check=1;
        ti=i;
        for(i=0;i<argc-1;i++)
        {
            if(NULL!=files[i])
            {
                if(check)
                {
                    imin=i;
                    check=0;
                    continue;
                }
                if(input[i]<input[imin])
                {
                    imin=i;
                }
            }
        }
        i=ti;
        if(NULL!=files[i])
        {
            if(input[imin] != 666)
                printf("%lf\n", input[imin]);
            else 
            {
                    input[imin] = 777;
                    k=1;
            }
            if (input[imin] != 777)
            {
                min = input[imin];
            }
            scanfreturn2=fscanf(files[imin], "%lf", &input[imin]);
            if(EOF==scanfreturn2)
            {
                fclose(files[imin]);
                files[imin] = NULL;
                fileqty--;
                continue;
            }
            if(0==scanfreturn2)
            {
                fscanf(files[imin], "%c");
                input[imin]=666;
            }
            if(min > input[imin])
            {
                fclose(files[imin]);
                files[imin] = NULL;
                fileqty--;
                printf("\"%s\" dont true\n",argv[imin+1]);
            }
        }
    }
    while(fileqty);
    if (k)
        printf("input data have dont INT symbols, but anyway TRUE\n");
    free(input);
}
 
 
int main(int argc, char * argv[])
{
    FILE **files=NULL;
    int i=0;
    int filecount=0;
    files=(FILE **)calloc(argc-1,sizeof(FILE *));
    if(NULL == files)
    {
        printf("Fatal Eror");
        return 2;
    }
    if(1==argc)
    {
        printf("Didnt see file names");
        return 1;
    }
    scan(files,argv,argc);
    print(files,argv,argc);
    printf("END");
    free(files);
    getchar();
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5
Похожие ответы