내 알고리즘 및 데이터 구조에 대한 솔루션을 개발하려고합니다. 나는 데이터베이스에 존재하는 숫자 (행 수에 해당)로 읽은 숫자를 비교하여 학생을 데리고 오는 함수가있다.파일 이름을 삭제할 수 없으며 임시 파일의 이름을 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 사이클에서 문제가됩니까?
[루프 조건에서 'feof()'사용을 중지하십시오.] (http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong). 예외의 가장 드문 경우를 제외하고는 모든 것이 틀리며, 이것은 예외는 아닙니다. – WhozCraig