0

我正在尝试为我的算法和数据结构主题开发解决方案。我有一个函数可以让学生比较我数据库中存在的数字读取的数字(对应于行数)。

就在系统输入餐点时发生,每周每天只有 1 餐。到目前为止,没有任何问题。

系统检查学生的余额,如果学生余额为0.0或小于3(即每顿饭的费用),系统会提示或自动推荐加载余额,并且大部分步骤都正确。

事实证明,这可能是由于几个实现的周期,我几乎一切都进展顺利,但在功能指令的末尾,指令remove(filename); andrename("backup.c",filename);`

代码:

void EncomendaRefeicoes()
{
    FILE *myFile;

    FILE *fin, *fout;//ficheiro de entrada ficheiro de saida 
    const char *fn = "database-aluno.txt";
    myFile = fopen(filename, "r");
    int num; //numero
    rewind(myFile);
    printf("Insrira o numero de aluno");//Ask of number
    scanf("%d", &num);//read number
    printf("\n A verificar se o aluno existe!");//Check
    //procurar estudante
    int fnum = 0;//student number in file
    struct Aluno student;
    char fnom[50];//student file name
    char saldotostring[5];//
    double saldo;//saldo 
    //int i=0;

    while (!(feof(myFile)))//enquanto difrente de fim de ficheiro(feof)
    {
        fscanf(myFile, "%d %s %s %lf %d-%d\n", &Aluno[acstruct].num, Aluno[acstruct].name, Aluno[acstruct].fname, &Aluno[acstruct].saldo, &Aluno[acstruct].dia, &Aluno[acstruct].mes);
        //file scan as variaveis num,name,saldo,dia,mes

        if (num == Aluno[acstruct].num) //se num lido == num ficheiro
        {
            printf("\n");
            printf("\n");
            printf("Aluno %d encontrado", num);//Dizer que foi encontrado
            printf("\n");
            printf("Numero: %d", Aluno[acstruct].num);//imprime numero
            printf("\n");
            printf("Nome: %s", Aluno[acstruct].name);//imnprime nome
            printf("\n");
            printf("Subnome: %s", Aluno[acstruct].fname);
            printf("\n");
            //sprintf(saldotostring, "%.2f", saldo);
            printf("Saldo: %.2f", Aluno[acstruct].saldo);//imprime saldo
            printf("\n");
            printf("Custo de aquisicao: 3.00 euros \n");//diz qual o custo de aquisicao
            printf("\n");



            //Menu
            SelectOneFood(6, fp1);
            printf("\n");
            printf("Quer enconendar? \n");

            printf("1-Reservar \n");
            printf("\n");
            printf("2-Mandar-me para o menu principal \n");
            int opcaoescolhida;
            scanf("%d", &opcaoescolhida);
            double price = 3.00;

            if (opcaoescolhida == 1)
            {
                if (Aluno[acstruct].saldo == 0.0)
                {

                    char op = 'N';
                    printf("Nao tem saldo. Deseja carregar o plafound? (Primir N para nao) \n");
                    /*
                    if (scanf("%c", op) == 'N')
                    {
                    _tmain();
                    }
                    */
                    printf("Valor a inserir: ");
                    printf("\n");

                    scanf("%lf", &saldo);
                    if (saldo < 5.00)
                    {
                        printf("Minimo de carregamento obrigatorio e de 5 euros \n");
                        scanf("%lf", &saldo);

                    }
                    fin = fopen(fn, "r");
                    fout = fopen("sbackup.txt", "w");//an temporary file
                    rewind(fin);
                    rewind(fout);
                    while (!(feof(fin))){
                        //Lê 1 a 1
                        fscanf(fin, "%d %s %s %lf %d-%d\n", &Aluno[acstruct].num, Aluno[acstruct].name, Aluno[acstruct].fname, &Aluno[acstruct].saldo, &Aluno[acstruct].dia, &Aluno[acstruct].mes);

                        if (num == Aluno[acstruct].num)
                            fprintf(fout, "%d %s %s %lf %d-%d\n", Aluno[acstruct].num, Aluno[acstruct].name, Aluno[acstruct].fname, saldo, Aluno[acstruct].dia, Aluno[acstruct].mes);
                        else if (num != Aluno[acstruct].num)

                            fprintf(fout, "%d %s %s %lf %d-%d\n", Aluno[acstruct].num, Aluno[acstruct].name, Aluno[acstruct].fname, Aluno[acstruct].saldo, Aluno[acstruct].dia, Aluno[acstruct].mes);

                    }

                    remove(filename);
                    rename("sbackup.txt",filename);
                    printf("\n");
                    printf("Saldo alterado");
                    fclose(fout);
                    fclose(myFile);
                    fclose(fin);

                }

                /*
                if (Aluno[acstruct].saldo < price)
                printf("Voce nao tem saldo suficiente \n");
                */
                else if (Aluno[acstruct].saldo >= price)
                {
                    Aluno[acstruct].saldo = Aluno[acstruct].saldo - price;
                    //substiruir saldo no ficheiro de texto

                    printf("Refeicao adequerida com sucesso \n");
                    printf("Saldo Final %.2f euros", Aluno[acstruct].saldo);


                }
            }
            if (opcaoescolhida == 2)
                _tmain();

        }

    }
}

我怎么解决这个问题?在 if 和 while 循环中会出现问题吗?

4

1 回答 1

0

为什么不检查返回值,remove()如果出现错误,检查errno?

IMO,问题是,您正在remove()使用已fopen()编辑但尚未fclose()d 的文件的指针进行调用。

于 2014-12-30T11:53:15.147 回答