minomic ha scritto:
Ti posto un codice che avevo scritto qualche tempo fa, sempre per un thread sul forum.
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE* fp_1 = fopen("primo.txt", "r");
FILE* fp_2 = fopen("secondo.txt", "w");
int riga_eliminare, conta_righe;
size_t lungh = 0;
ssize_t letti;
char* line = NULL;
printf("Quale riga vuoi eliminare? ");
scanf("%d", &riga_eliminare);
riga_eliminare--; // cosi' conto da zero
conta_righe = 0;
while ((letti = getline(&line, &lungh, fp_1)) != -1) {
if(conta_righe++ != riga_eliminare) {
printf("%s", line); // si puo' anche eliminare
fprintf(fp_2, "%s", line); // ricopio la riga
}
}
fclose(fp_1);
fclose(fp_2);
remove("primo.txt");
rename("secondo.txt", "primo.txt");
return 0;
}
Qui si eliminava una riga in base alla sua posizione (la prima, la seconda, ecc.) ma lo puoi facilmente adattare alle tue esigenze.
Sono riuscito a farlo finalmente solo che adesso ho un problema se la riga da cancellare è la prima o l'ultima non la cancella e ne cancella un'altra random, posto il codice sotto:
Lista elimina_valore(Lista L) {
/*apro i file*/
FILE* fp = fopen("lista.txt", "r");
FILE* fn = fopen("secondo.txt", "w+");
/*acquisisco il valore del numero da cancellare*/
printf("Inserisci il numero da cancellare\n");
scanf("%s %lg %lg", id, &reale, &immaginario);
/*ciclo acquisendo i valori fino alla fine del file*/
while ((fscanf(fp, "%s %lg %lg", id, &reale, &immaginario) != EOF )) {
/*controllo se i valori inseriti sono diversi da quelli del file*/
if((strcmp(nodo->next->id, id) != 0) || (nodo->next->reale != reale) || (nodo->next->immaginario != immaginario)) {
fprintf(fn, "%s %g %g\n", id, reale, immaginario); /*stampo i valori sul secondo file
tranne quello insertito da tastiera*/ }
}
/*chiudo i file aperti*/
fclose(fp);
fclose(fn);
remove("lista.txt"); /*elimino il primo file*/
rename("secondo.txt", "lista.txt"); /*rinomino il secondo file con il nome del primo*/
return 0;
}