Newsgroup: it.comp.lang.c
Titolo: Un aiuta per favore

Scusate la poca chiarezza, effettivamente chi ha risposto ha ragione.
Il mio problema e che devo costruire un programma che all'inserimento
di una data mi restituisca una struttura salvata su un file e che mi dia la
possibilità di modificare determinati campi.
Ho scritto qualcosa ancora da definire, ma il mio problema e che
non ho le idee chiare sull'accesso sui file.
Il mio listato è il seguente:
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct registro {
   int Numero;
   char cogn  [15];
   char nome  [15];
   char prima   [10];
   char seconda [10];
   char terza   [10];
   char quarta  [10];
   char quinta  [10];
};
int menu(void);
void textFile(FILE *);
void aggiornaRecord(FILE *);
void nuovoRecord(FILE *);
void cancellaRecord(FILE *);
void leggi_studente_ore(FILE *out);
main()
{
   FILE *cfPtr;
   int scelta;
   if ((cfPtr = fopen("ore.txt", "r+")) == NULL)
      printf("Errore il file non puo' essere aperto.\n");
   else {
      while ((scelta = menu()) != 6) {
      clrscr();
         switch (scelta) {
            case 1:
               textFile(cfPtr);
               break;
            case 2:
               aggiornaRecord(cfPtr);
               break;
            case 3:
               nuovoRecord(cfPtr);
               break;
            case 4:
               leggi_studente_ore(cfPtr);
               break;
            case 5:
             cancellaRecord(cfPtr);
               break;
          default :
             printf("\nScelta non valida!\n\n");
             system("PAUSE");
               clrscr();
         }
      }
   }
   fclose(cfPtr);
   return 0;
}
void textFile(FILE *readPtr)
{
   FILE *writePtr;
   struct registro studenti;
   if ((writePtr = fopen("Studenti.txt", "w")) == NULL)
      printf("Errore il file non puo' essere aperto.\n");
   else {
      rewind(readPtr);
      fprintf(writePtr, "%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n",
      "Numero", "Cognome", "Nome", "1 ORA", "2 ORA", "3 ORA", "4 ORA", "5
ORA");
      while (!feof(readPtr)) {
         fread(&studenti, sizeof(struct registro), 1, readPtr);
         if (studenti.Numero != 0)
            fprintf(writePtr, "%-10d%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n",
                    studenti.Numero,
                    studenti.cogn,
                    studenti.nome,
                    studenti.prima,
                    studenti.seconda,
                    studenti.terza,
                    studenti.quarta,
                    studenti.quinta);
      }
   }
   fclose(writePtr);
   system("pause");
   clrscr();
}
void aggiornaRecord(FILE *fPtr)
{
   int pos;
   char cambia[10];
   struct registro ore;
   printf("Digita il numero di posizione dello studente(1 - 100): ");
   scanf("%d", &pos);
   fseek(fPtr, (pos - 1) * sizeof(struct registro),SEEK_SET);
   fread(&ore, sizeof(struct registro), 1, fPtr);
   if (ore.Numero == 0)
      printf("La posizine numero %d e' vuota.\n", pos);
   else {
      printf("%-10d%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n\n",
             ore.Numero,
             ore.cogn,
             ore.nome,
             ore.prima,
             ore.seconda,
             ore.terza,
             ore.quarta,
             ore.quinta);
      printf("Entra per aggiungere (+) o per sottrarre (-): ");
      scanf("%s", &cambia);
      strcpy(ore.prima, cambia);
      printf("%-10d%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n",
             ore.Numero,
             ore.cogn,
             ore.nome,
             ore.prima,
             ore.seconda,
             ore.terza,
             ore.quarta,
             ore.quinta);
      fseek(fPtr, (pos - 1) * sizeof(struct registro),SEEK_SET);
      fwrite(&ore, sizeof(struct registro), 1, fPtr);
   }
    system("pause");
   clrscr();
}
void cancellaRecord(FILE *fPtr)
{
   struct registro ore, ore_vuote = {0, "", "", "", "", "", "", ""};
   int pos;
   printf("Digita il numero di posizione da eliminare (1 - 100): ");
   scanf("%d", &pos);
   fseek(fPtr, (pos - 1) * sizeof(struct registro),
         SEEK_SET);
   fread(&ore, sizeof(struct registro), 1, fPtr);
   if (ore.Numero == 0)
      printf("La posizione numero %d e' vuota.\n", pos);
   else {
      fseek(fPtr, (pos - 1) * sizeof(struct registro),SEEK_SET);
      fwrite(&ore_vuote, sizeof(struct registro), 1, fPtr);
   }
}
void nuovoRecord(FILE *fPtr)
{
   struct registro ore;
   int pos;
    printf("Registra un nuovo studente digita la posizine (1 - 100): ");
    scanf("%d", &pos);
   fseek(fPtr, (pos - 1) * sizeof(struct registro),SEEK_SET);
   fread(&ore, sizeof(struct registro), 1, fPtr);
   if (ore.Numero != 0)
      printf("Il conto numero %d e' gia' registrato.\n",ore.Numero);
   else {
      printf("Inserire Cognome, Nome, Frequenze ore\n\n\n ");
      printf("\nInserire il cognome...:");
         scanf("%s", &ore.cogn);
      printf("Inserire il nome...:");
         scanf("%s",&ore.nome);
      printf("\n1 ORA...:");
       scanf("%s",&ore.prima);
      printf("\n2 ORA...:");
       scanf("%s",&ore.seconda);
      printf("\n3 ORA...:");
       scanf("%s",&ore.terza);
   printf("\n4 ORA...:");
       scanf("%s",&ore.quarta);
      printf("\n5 ORA...:");
       scanf("%s",&ore.quinta);
      ore.Numero = pos;
    fseek(fPtr, (ore.Numero - 1) * sizeof(struct registro), SEEK_SET);
      fwrite(&ore, sizeof(struct registro), 1, fPtr);
   }
   system("pause");
   clrscr();
}
void leggi_studente_ore(FILE *out)
{
   struct registro regis;
   if ((out = fopen("ore.txt", "rb")) == NULL)
      printf("Il file non puo' essere aperto verifica l'esistenza.\n");
   else {
      printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n", "Numero",
"Cognome",
             "Nome", "1 ORA", "2 ORA", "3 ORA", "4 ORA", "5 ORA");
      printf("-------------------------------------");
      printf("--------------------------------------\n\n");
      while (!feof(out)) {
         fread(&regis, sizeof(struct registro), 1, out);
         if (regis.Numero != 0)
            printf("%-10d%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n",
                   regis.Numero,
                   regis.cogn,
                   regis.nome,
                   regis.prima,
                   regis.seconda,
                   regis.terza,
                   regis.quarta,
                   regis.quinta);
      }
   }
   fclose(out);
   system("pause");
   clrscr();
}
int menu(void)
{
   int seleziona;
    puts("\t\tPROGRAMMA PER LA GESTIONE DELLE ASSENZE DEGLI STUDENTI");
      puts("\n\t\t\t\tMENU' INTERATTIVO");
      puts( "\t\t------------------------------------------------------" ) ;
    //printf("\nSeleziona una scelta\n"
      printf("\n\t\t1 - Salva il file \" Studenti.txt \" per la stampa\n"
           "\n\t\t2 - Aggiorna le presenze dello studente\n"
            "\n\t\t3 - Registra un nuovo studente\n"
            "\n\t\t4 - Visualizza gli studenti\n"
           "\n\t\t5 - Elimina uno studente dal registro\n"
           "\n\t\t6 - Uscita dal programma\n "
            "\n\n\nSeleziona una scelta...:");
    scanf("%d", &seleziona);
    return seleziona;
}
Grazie per l'attenzione.

ho avuto un problema simile al tuo non appena  settimane fa....
il problema č non poco complesso, serve di sapere:
i record occupano tutti lo stesso spazio? nel senso che hanno tutti una
stess lunghezza, o meno?
nel caso tu riesca ad avere tutti i record della stessa lunghezza, la
soluzione č banale:
anzichč usare la
   fseek(fPtr, (pos - 1) * sizeof(struct registro),SEEK_SET);
potresti ad esempio cercare il record precedente a quello da modificare,
copiare tutto il file su un file di appoggio (tranne la stringa da
modificare), modificare quella parte e poi ricopiare il tutto nuovamente sul
tuo file.
č un poco macchinosa come soluzione, ma č la piu' affidabile, dal mio punto
di 
vista.se
 sono stato poco chiaro, posta di nuovo senza nessun problema.
fabio