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()

于 2014-12-30T11:53:15.147 に答える