2014-12-30 6 views
0

내 알고리즘 및 데이터 구조에 대한 솔루션을 개발하려고합니다. 나는 데이터베이스에 존재하는 숫자 (행 수에 해당)로 읽은 숫자를 비교하여 학생을 데리고 오는 함수가있다.파일 이름을 삭제할 수 없으며 임시 파일의 이름을 database-aluno.txt로 바꿀 수 없습니다.

그런 다음 시스템에서 식사를 입력합니다. 이는 매주 매일 1 번만입니다. 지금까지 아무런 문제가 없습니다.

시스템은 학생의 잔고를 확인하고 학생의 잔액이 0.0 미만이거나 잔액이 3 미만 (각 식사의 비용) 인 경우 시스템에 자동으로 잔액을 넣으라는 메시지가 표시되거나 자동으로 권장되며 모든 단계가 대부분 수행됩니다 바르게.

내가 잘가는 거의 모든 것을 가지고 있지만, 어쩌면 인해 여러 구현 사이클, 밝혀 함수 지침의 끝 지침 remove(filename); and 이름 바꾸기 ("backup.c", 파일 이름)에서, '

CODE :

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 사이클에서 문제가됩니까?

+0

[루프 조건에서 'feof()'사용을 중지하십시오.] (http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong). 예외의 가장 드문 경우를 제외하고는 모든 것이 틀리며, 이것은 예외는 아닙니다. – WhozCraig

답변

0

왜 반환 값이 remove()인지 확인하고 오류가있는 경우 errno을 확인하십시오.

IMO, 문제는 이미 fopen()이고 아직 fclose() 인 파일의 포인터로 remove()을 호출하는 것입니다. d.