i307 Posted June 5, 2011 at 04:27 PM Report #393652 Posted June 5, 2011 at 04:27 PM Tenho estado a martelar nesta função e não há forma de pôr a funcionar. Talvez tenha complicado demais , mas fui sempre fazendo o que era necessário. O objectivo é a função receber 2 valores inteiros (o utilizador e o livro) , passa o conteudo do ficheiro para um vector. Depois verifica o 1º valor , e quando esse valor é igual ao utilizador e o seguinte é igual ao livro então ele apaga esses 2 valores. Depois volta a pôr para o ficheiro. Envio aqui a função para contar as linhas e a função que elimina os inteiros. Mas para o ficheiro de texto estão a passar no fim valores confusos. int count_elef() { FILE *arquivo = fopen("req.txt", "r"); int caractere, existe_linhas = 0; int quant_linhas = 0; while((caractere = fgetc(arquivo)) != EOF){ existe_linhas = 1; if(caractere == '\n'){ quant_linhas++; } } return quant_linhas; } int remover_int(int k, int **v ,int n) { int j; for (j = k; j < n; ++j) v[j-1] = v[j]; return n - 1; } void devolver_livro(int utilizador , int livro){ FILE *fp; int **v; int del=-1,del1=-1; int k =0 , j=0 , i=0; int n=0; n = count_elef()*2; v = (int**) malloc(sizeof(int*)* n ); fp = fopen("req.txt", "r"); if (fp==NULL) printf("Impossivel abrir o ficheiro\n"); for(i=0;i<n;i++) { fscanf(fp,"%i",&v[i]); } for (i=0;i<n;i++){ if (i%2==0) /* --> numero e' posicao impar */ if(v[i]==utilizador && v[i+1]==livro) { remover_int(i,v,n); remover_int(i+1,v,n); } } fclose(fp); fp = fopen("req.txt", "r+"); for(i=0;i<n;i++) { if (i%2==0) fprintf(fp,"%i ",v[i]); else fprintf(fp,"%i\n",v[i]); } fclose(fp); }
KTachyon Posted June 5, 2011 at 05:12 PM Report #393658 Posted June 5, 2011 at 05:12 PM O normal é o ficheiro ser re-escrito. Lembra-te que quando vais remover texto do ficheiro, pelo menos todos os dados a partir do ponto em que removes vai ter que ser todo rescrito em disco até ao final do ficheiro. “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
i307 Posted June 5, 2011 at 05:29 PM Author Report #393664 Posted June 5, 2011 at 05:29 PM O normal é o ficheiro ser re-escrito. Lembra-te que quando vais remover texto do ficheiro, pelo menos todos os dados a partir do ponto em que removes vai ter que ser todo rescrito em disco até ao final do ficheiro. eu sei que vai ser re-escrito. mas por acaso agora que falas vejo que é melhor retirar o "r+" e subsituir por "w" . pois o "w" é que recria enquanto o "r+" EDIT: ya , era mesmo esse o problema.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now