Newsgroup: it.comp.lang.c
Titolo: Aiuto Stringhe

Sono quasi rassegnato...ho scritto il seguente codice affinchè
eseguisse le seguenti operazioni:
APRE UN FILE;
PRENDE IN INPUT UNA STRINGA;
VERIFICA CHE QUESTA STRINGA SIA PRESENTE NEL FILE;
SE LO è LA CANCELLA.
Ebbene tutto ciò non viene fatto...
Di seguito riporto il codice.. per favore correggetelo....
#include <stdio.h>
#include <string.h>
#define DIM 40
#define file "elenco_esami.txt"
struct esa 
{
    char nome[DIM];
};
FILE *fp;
struct esa esame;
void ins_esame(void)
{
    char invio;
 
    fp = fopen(file,"a+");
 
    printf("Inserire Nome Esame: ");
    gets(esame.nome);
 
 
    fwrite(&esame,sizeof(esame.nome),1,fp);
    fprintf(fp,"%s","\n");
 
    fclose(fp);
 
}
void vis_esame(void)
{
    printf("\nNome: %s",esame.nome);
}
 
long cer_esame(char *nome_esame)
{
    int n;
    long pos = 0;
 
    int i;
 
 
 
    fp = fopen(file,"r");
 
    for(i = 0; i < 10; i++)
    {
        n = fread(&esame,sizeof(esame.nome),1,fp);
 
        if (n == 0)
        {
            fclose(fp);
            pos = -1;
            return (pos);
        }
 
        if(strcmp(nome_esame,esame.nome) == 0)
        {
            pos = ftell(fp);
            fclose(fp);
            return(pos-sizeof(esame.nome));
        }
    }            
}    
void eli_esame(long pos)
{
    strcpy(esame.nome,"");
 
    fp = fopen(file,"r+");
 
    fseek(fp,pos,0);
 
    fwrite(&esame,sizeof(esame.nome),1,fp);
 
    fclose(fp);
}    
void can_esame(void)
{
    char nome[DIM];
    char pausa;
 
    long pos;
 
    printf("Nome Esame:");
    gets(nome);
 
    pos = cer_esame(nome);
 
    if (pos == 0)
    {
        printf("\n Esame non presente");
        return;
    }
 
    vis_esame();
 
    printf("\nConfermi cancellazione ? (S/N)");
    scanf("%c",&pausa);
 
    if(toupper(pausa) == 'S')
    {
        eli_esame(pos);
        return;
    }
}        
 
 
int main()
{
    can_esame();
 
 
    system("PAUSE");
 
    return 0;
 
        }
Vi ringrazio anticipatamente!!

 }    
Questo non funzionerà mai. Non puoi "eliminare" il contenuto di un file, al 
massimo lo puoi sovrascrivere. Tu in questo codice stai solo sovrascrivendo il 
vecchio nome con qualcos'altro (a spanne direi che sostituisci solo il primo 
carattere con uno zero).
La soluzione è quella che ti ho già proposto, copia tutto il file, man mano che 
lo leggi, su un file temporaneo, ma rimuovi la stringa incriminata dalla riga in 
cui l'hai trovata (faccio prima a scrivere il codice che a spiegare, è un mio 
difetto):
while(fread(line, sizeof(line), in) != NULL) {
     char* p=strstr(line, esame.nome);
     if(p != 0) {
         /* rimuovi la stringa */
         char* line_end = line + strlen(line);
    	int nome_len=strlen(esame.nome);
         memmove(p, p+len, line_end - p + len);
     }
     fputs(line, out);
}
/* rimuovi il file vecchio */
/* rinomina il file temp. col nome del file vecchio */
Cerca tu di adattarlo al tuo programma, leggi il manuale delle funzioni strlen, 
memmove, etc se non sai cosa fanno.
Anche questo, scritto a memoria, non l'ho compilato, non so se funzioni ;-)
Daniele

         memmove(p, p+len, line_end - p + len);
Errata corrige:
           memmove(p, p+len, line_end - (p + len));