Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117

    [C++] Scrittura su file

    Ho un piccolo problema...

    Io apro un file in modalità append... Ci scrivo sopra, ma quando lo vado ad aprire e a leggere quello che ci ho scritto non è stato salvato.

    Però succede dopo un certo numero di volte, cioè fino a qualche scrittura fa andava tutto ok... poi accade questo.

    Sopra ci scrivo delle classi:

    fwrite(&aux,1,sizeof(Classe),fp);

    Aiutatemi please...

  2. #2
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    forse non lo chiudi con fclose(*FILE)

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    si... lo chiudo... non è quello il problema...

  4. #4
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    forse le classi non possono essere scritte con fwrite, infatti quando fwrite è stata implementata le classi non esistevano essendo una funzione C.
    Per scrivere classi su file potresti overlodare l'operatore << e dirgli tu come impostare l'output.
    Sennò crei una funzione dentro la classe e scrivi con fwrite i vari membri.

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    nerratow il problema è un altro... a me me le fa scrivere le classi... finora le ho scritte e me le ha lette... il problema è ke all'improvviso il prog non funziona +... senza nessuna modifica... così all'improvviso non scrive più, non legge +, non so...

  6. #6
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    :master:

    posta tutto se possibile e il compilatore che stai usando.
    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    Sono tre file:

    FILE lis.h
    codice:
    #include <malloc.h>
    #include <string.h>
    
    extern char file[100];
    
    struct nodo {
       Sms val;
       struct nodo *next;
    };
    
    class Lista {
       public:
       Lista(void)
       {  
          lung = 0;
          l = NULL;
       }
    
       ~Lista(void)
       {  // DISTRUTTORE
          struct nodo *aux;
          while (l != NULL)
          {
    	 aux = l;
    	 l = l->next;
    	 free(aux);
          }
          l = NULL;
          lung = 0;
       }
    
       void inserisci(int pos, Sms ele)
       {
          if ((pos >= 1) && (pos <= lung+1))
          {
    	 int i = 1;
    	 struct nodo *p = l;
    	 struct nodo *aux = (struct nodo *)malloc(sizeof(struct nodo));
    	 struct nodo *prec = NULL;
    	 aux->val = ele;
    	 while (i != pos)
    	 {
    	    prec = p;
    	    p = p->next;
    	    i++;
    	 }
    	 aux->next = p;
    	 if (prec != NULL)
    	    prec->next = aux;
    	 else
    	    l = aux;
    	 lung++;
          }
       }
    
       void elimina(int pos)
       {
          if ((pos >= 1) && (pos <= lung))
          {
             int i = 1;
             struct nodo *p = l;
             struct nodo *prec = NULL;
             while (i != pos)
             {
    	    prec = p;
    	    p = p->next;
    	    i++;
    	 }
    	 if (prec != NULL)
    	    prec->next = p->next;
    	 else
    	    l = l->next;
    	 free(p);
    	 lung--;
          }
       }
    
       void mostra(int pos)
       {
          if ((pos >= 1) && (pos <= lung))
          {
    	 struct nodo *p = l;
    	 for (int i = 1; i != pos; i++)
    	    p = p->next;
    	 p->val.visualizza();
          }
       }
       
       void cerca(char *p)
       {
    	   struct nodo *s;
    	   for (s = l; s != NULL; s = s->next)
    	   		if (s->val.confronta(p))
    	   		{
    		   		system("cls");
    	   			s->val.visualizza();
    	   			putchar('\n');
    	   			system("PAUSE");
       			}
       }
    	   
    
       int lunghezza(void)
       {
          return lung;
       }
    
       int vuota(void)
       {
          return (lung == 0);
       }
       
       void salva(void)
       {
    	   struct nodo *p;
    	   char scelta;
    	   printf("\n\nVuoi salvare? ");
    	   scanf("%c%*c",&scelta);
    	   if (scelta != 's' && scelta != 'S')
    	   		return;
    	   FILE *fp = fopen(file,"w");
    	   if (fp != NULL)
    	   {
    		   for (p = l; p != NULL; p = p->next)
    			   fwrite(&(p->val), 1, sizeof(Sms), fp);
    		   printf("\n\nSalvato\n\n");
    		   fclose(fp);
    	   }
    	   else
    	   		printf("\nNon riuscito\n");
    	   	system("PAUSE");
       }
    
          
       protected: int lung;
       protected: struct nodo *l;
    };
    
    class Lista_ordinata : public Lista
    {
       public: 
       void inserisci(Sms n)
       {
          int i;
          struct nodo *p;
          bool inserito = false;
          for (i = 1, p = l; i <= lung; i++)
          {
    	 if (p->val >= n)
    	 {
    	    Lista::inserisci(i,n);
    	    inserito = true;
    	    break;
    	 }
    	 p = p->next;
          }
          if (!inserito)
          {
    	 Lista::inserisci(lung+1,n);
    	 inserito = true;
          }
       }
    
       void elimina(Sms n)
       {
          int i;
          struct nodo *p;
          bool eliminato = false;
          for (i = 1, p = l; p != NULL; i++, p = p->next)
          {
    	 if (p->val == n)
    	 {
    	    Lista::elimina(i);
    	    eliminato = true;
    	    break;
    	 }
          }
          if (eliminato)
    	 printf("Operazione riuscita\n");
          else
    	 printf("Elemento non presente\n");
       }
       
       FILE *apri(void)
       {
    	   Sms aux;
    	   struct nodo *p;
    	   printf("\n\nChe file vuoi aprire? ");
    	   scanf("%[^\n]%*c",file);
    	   FILE *fp = fopen(file,"a+");
    	   if (fp != NULL)
    	   {
    		   while (fread(&aux, 1, sizeof(Sms), fp))
    		   	   inserisci(aux);
    		   return fp;
    	   }
    	   else
    	   {
    	   		printf("\nNon riuscito\n");
    	   		return NULL;
       		}
       }
    };
    FILE sms.h
    codice:
    class Sms
    {
    	private:
    	char testo[481];
    	char persona[20];
    	char modo;
    	struct data {
    		unsigned int giorno, mese, anno;
    	} data;
    	struct ora {
    		unsigned int ore, minuti;
    	} ora;
    	
    	public:
    	Sms()
    	{
    		testo[0] = '\0';
    		persona[0] = '\0';
    		modo = 'N';
    		data.giorno =  data.mese =  data.anno = 0;
    		ora.ore =  ora.minuti = 0;		
    	}
    	
    	~Sms()
    	{
    		testo[0] = '\0';
    		persona[0] = '\0';
    		modo = 'N';
    		data.giorno = data.mese = data.anno = 0;
    		ora.ore = ora.minuti = 0;
    	}
    	
    	int operator==(Sms &x)
    	{
    		if (modo == x.modo)
    			if (data.giorno == x.data.giorno)
    				if (data.mese == x.data.mese)
    					if (data.anno == x.data.anno)
    						if (ora.ore == x.ora.ore)
    							if (ora.minuti == x.ora.minuti)
    								if (strcmp(testo,x.testo) == 0)
    									if (strcmp(persona,x.persona) == 0)
    										return 1;
    		return 0;
    	}
    				
    	int operator>=(Sms &x)
    	{
    		if (data.anno > x.data.anno)
    			return 1;
    		if (data.anno == x.data.anno)
    		{
    			if (data.mese > x.data.mese)
    				return 1;
    			if (data.mese == x.data.mese)
    			{
    				if (data.giorno > x.data.giorno)
    					return 1;
    				if (data.giorno == x.data.giorno)
    				{
    					if (ora.ore > x.ora.ore)
    						return 1;
    					if (ora.ore == x.ora.ore)
    					{
    						if (ora.minuti >= x.ora.minuti)
    							return 1;
    					}
    				}
    			}
    		}
    		return 0;
    	}
    			
    	void inserisci(void)
    	{
    		do {
    			printf("\nInviato o Ricevuto? ");
    			scanf("%c%*c",&modo);
    		} while (modo != 'I' && modo != 'R');
    		printf("\n%s chi? ",(modo == 'I') ? "A" : "Da");
    		scanf("%[^\n]%*c",persona);
    		printf("\nInserisci il testo:\n");
    		scanf("%[^\n]%*c",testo);
    		printf("\nAnno: ");
    		scanf("%d%*c",&data.anno);
    		printf("\nMese: ");
    		scanf("%d%*c",&data.mese);
    		printf("\nGiorno: ");
    		scanf("%d%*c",&data.giorno);
    		printf("\nOra: ");
    		scanf("%d%*c",&ora.ore);
    		printf("\nMinuti: ");
    		scanf("%d%*c",&ora.minuti);
    	}
    	
    	void visualizza(void)
    	{
    		printf("\n%s : %s",(modo == 'I') ? "Inviato a" : "Ricevuto da",persona);
    		printf("\t\t%d/%d/%d",data.giorno,data.mese,data.anno);
    		printf("\tOre %d:%d\n\n",ora.ore,ora.minuti);
    		printf("%s\n",testo);
    	}
    
    	int confronta(char *p)
    	{
    		return (!(strcmp(p,persona)));
    	}
    };
    FILE principale
    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "sms.h"
    #include "lis.h"
    
    char file[100];
    
    int main()
    {
    	Lista_ordinata lista_sms;
    	Sms sms;
    	char pers[21];
    	int scelta,i;
    	FILE *fp = lista_sms.apri();
    	if (fp == NULL)
    		return 0;
    	do {
    		system("cls");
    		printf("\nGESTIONE SMS\n\n");
    		printf("1) Inserisci sms\n");
    		printf("2) Ricerca\n");
    		printf("3) Visualizza lista\n");
    		printf("\n0)Fine\n");
    		printf("\t\tScelta: ");
    		scanf("%d%*c",&scelta);
    		switch (scelta)
    		{
    			case 1:
    				sms.inserisci();
    				lista_sms.inserisci(sms);
    				fwrite(&sms,1,sizeof(Sms),fp);
    				fflush(fp);
    				break;
    			case 2:
    				printf("Mittente/Destinatario: ");
    				scanf("%[^\n]%*c",pers);
    				lista_sms.cerca(pers);
    				break;
    			case 3:
    				for (i = 1; i <= lista_sms.lunghezza(); i++)
    				{
    					system("cls");
    					lista_sms.mostra(i);
    					putchar('\n');
    					system("PAUSE");					
    				}
    				break;
    		}
    	} while (scelta);
    	fclose(fp);
    }
    uso il compilatore mingw

  8. #8
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    che dire... a me funziona meravigliosamente, ho solo aggiunto il return 0 alla fine del principale per togliere il warning e commentato struct nodo *p in lis.h visto che non veniva mai usato, ma funzionava anche prima.
    Uso VC++6.0 funziona a debug e a release.
    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    nella funzione apri hai commentato struct nodo *p???

    ma cmq per un certo periodo ha funzionato anche a me... poi ad un certo punto la morte...

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    ecco... ora funziona di nuovo... forse xkè gli ho fatto prima una scrittura in modalità write... non lo so ke gli pija a sto coso... ma c'è un numero massimo di append ke si possono fare ad un file?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.