2014-12-30 4 views
0

Я пытаюсь разработать решение для моих задач и объектов структур данных. У меня есть функция, которая принимает учащегося через сравнение числа, считанного числом, которое существует в моей базе данных (соответствует количеству строк).Не удается удалить имя файла и не может переименовать мой временный файл в базу данных-aluno.txt

Бывает, что система поступает в еду, которая составляет только 1 для каждого дня каждой недели. До сих пор никаких проблем.

Система проверяет баланс студента, и если у ученика есть баланс 0.0 или меньше 3 (это стоимость каждого приема пищи), система запрашивает или автоматически рекомендует загрузить баланс и в основном выполнять все этапы правильно.

Оказывается, что, возможно, из-за нескольких реализованных циклов, у меня есть почти все, чтобы идти хорошо, но в конце инструкции вызывается функция инструкции remove(filename); and переименования («backup.c», имя файла); `

КОД:

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, проблема в том, что вы вызываете remove() с указателем файла, который уже fopen() ed и еще не fclose() d.

 Смежные вопросы

  • Нет связанных вопросов^_^