CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

di il
17 risposte

CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

Salva, ho creato il codice di un programma che in base alla scelta dell'utente, prende strade diverse. Nessun problema se non fosse per la 4 che chiede di convertire l'iniziale di tutte le stringhe. Il codice che ho scritto funziona parzialmente (mi riferisco al case 4) infatti ad esempio su tre stringhe mi effettua la conversione ma "ignora quella centrale" e soprattutto non le inserisce nel file convertite. Vi allego il codice:

/* Scrivere un programma che consenta, a scelta dell'utente, di:
1) Creare un file contenente un testo di 20 righe;
2) Stampare il file;
3) Contare il numero di occorrenze del carattere 'e' per ciascuna riga e in totale;
4) Sostituire il primo carattere di ogni riga con il corrispondente maiuscolo. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

int main (void)
{
	FILE *puntaFile;
	char buffer [MAX+1];
	char nome [MAX+1];
	int scelta,i,l;
	int tot=0,tot2=0,c=0;
	char carattere;
    
	printf ("Inserire '1' per creare un file contenente un testo di 20 righe");	
	printf ("\nInserire '2' per stampare il file");
	printf ("\nInserire '3' per contare il numero di occorrenze del carattere 'e' per ciascuna riga e in totale");
	printf ("\nInserire '4' per sostituire il primo carattere di ogni riga con il corrispondente maiuscolo");
	printf("\n\nInserisci la scelta: ");
	scanf("%d",&scelta);
	
	switch (scelta)
	{
		case 1:
			printf ("\nInserisci il nome del file da creare:  ");
			fflush(stdin);
			gets(nome);
			if((puntaFile=fopen(nome,"w"))==NULL)
			{
				printf("Erroe nell'apertura del programma.");
				exit;
			}
			for(i=0;i<20;i++)
			{
				printf("\nInserisci la riga %d: ",i+1);
				gets(buffer);
				fputs(buffer,puntaFile);
				fputc((int)'\n',puntaFile);
			}
		    
		    fclose(puntaFile);
		break;
		
		case 2:
			printf("\nInserisci il nome del file da stampare:  ");
			fflush(stdin);
			gets(nome);
			if ((puntaFile=fopen(nome,"r"))==NULL)
			{
				printf("\nErrore nell\'apertura del file.");
				exit;
			}
			while (fgets(buffer,MAX,puntaFile)!=NULL)
				printf ("%s",buffer);
			
			fclose (puntaFile);
		
		break;	
		
		case 3:
			printf("\nInserisci il nome del file: ");
			fflush(stdin);
			gets(nome);
			if((puntaFile=fopen(nome,"r"))==NULL)
			{
				printf ("\nIl file non puo\' essere aperto.");
				exit;
			}
			
			while(fgets(buffer,MAX,puntaFile)!=NULL)
			{
				l=strlen(buffer)-1;
				for(i=0;i<l;i++)
				{
					if (buffer[i]=='e')
					{
					tot++;
					tot2++;
				    }
				}
				c++;
				printf("\nNella stringa %d ci sono %d 'e'.",c,tot);
				tot=0;
			}
			    printf("\nIn tutto il file ci sono %d 'e'.",tot2);
			    fclose(puntaFile);
		break;
		
		case 4:
			printf("\nInserisci il nome del file:  ");
			fflush(stdin);
			gets(nome);
			
			if((puntaFile=fopen(nome,"r+"))==NULL)
			{
				printf("\nIl file non puo\' essere aperto.");
				exit;
			}
			while(fgets(buffer,MAX,puntaFile)!=NULL)
			{
			   buffer[0]=toupper(buffer[0]);
			   fprintf(puntaFile,"%s",buffer);
			   printf("%s",buffer);
			
		    }
		break;	
	   
		default:
			printf("\nL'utente non ha inserito alcuna scelta.");
		break;
	}			
}

17 Risposte

  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    Metti il codice tra tag code o non si capisce nulla
  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    Si scusa, eccolo

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 100
    
    int main (void)
    {
    	FILE *puntaFile;
    	char buffer [MAX+1];
    	char nome [MAX+1];
    	int scelta,i,l;
    	int tot=0,tot2=0,c=0;
    	char carattere;
        
    	printf ("Inserire '1' per creare un file contenente un testo di 20 righe");	
    	printf ("\nInserire '2' per stampare il file");
    	printf ("\nInserire '3' per contare il numero di occorrenze del carattere 'e' per ciascuna riga e in totale");
    	printf ("\nInserire '4' per sostituire il primo carattere di ogni riga con il corrispondente maiuscolo");
    	printf("\n\nInserisci la scelta: ");
    	scanf("%d",&scelta);
    	
    	switch (scelta)
    	{
    		case 1:
    			printf ("\nInserisci il nome del file da creare:  ");
    			fflush(stdin);
    			gets(nome);
    			if((puntaFile=fopen(nome,"w"))==NULL)
    			{
    				printf("Erroe nell'apertura del programma.");
    				exit;
    			}
    			for(i=0;i<20;i++)
    			{
    				printf("\nInserisci la riga %d: ",i+1);
    				gets(buffer);
    				fputs(buffer,puntaFile);
    				fputc((int)'\n',puntaFile);
    			}
    		    
    		    fclose(puntaFile);
    		break;
    		
    		case 2:
    			printf("\nInserisci il nome del file da stampare:  ");
    			fflush(stdin);
    			gets(nome);
    			if ((puntaFile=fopen(nome,"r"))==NULL)
    			{
    				printf("\nErrore nell\'apertura del file.");
    				exit;
    			}
    			while (fgets(buffer,MAX,puntaFile)!=NULL)
    				printf ("%s",buffer);
    			
    			fclose (puntaFile);
    		
    		break;	
    		
    		case 3:
    			printf("\nInserisci il nome del file: ");
    			fflush(stdin);
    			gets(nome);
    			if((puntaFile=fopen(nome,"r"))==NULL)
    			{
    				printf ("\nIl file non puo\' essere aperto.");
    				exit;
    			}
    			
    			while(fgets(buffer,MAX,puntaFile)!=NULL)
    			{
    				l=strlen(buffer)-1;
    				for(i=0;i<l;i++)
    				{
    					if (buffer[i]=='e')
    					{
    					tot++;
    					tot2++;
    				    }
    				}
    				c++;
    				printf("\nNella stringa %d ci sono %d 'e'.",c,tot);
    				tot=0;
    			}
    			    printf("\nIn tutto il file ci sono %d 'e'.",tot2);
    			    fclose(puntaFile);
    		break;
    		
    		case 4:
    			printf("\nInserisci il nome del file:  ");
    			fflush(stdin);
    			gets(nome);
    			
    			if((puntaFile=fopen(nome,"r+"))==NULL)
    			{
    				printf("\nIl file non puo\' essere aperto.");
    				exit;
    			}
    			while(fgets(buffer,MAX,puntaFile)!=NULL)
    			{
    			   buffer[0]=toupper(buffer[0]);
    			   fprintf(puntaFile,"%s",buffer);
    			   printf("%s",buffer);
    			
    		    }
    		break;	
    	   
    		default:
    			printf("\nL'utente non ha inserito alcuna scelta.");
    		break;
    	}			
    }
  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    Devi mostrare il testo con la riga maiuscola, o devi anche modificare la maiuscola nel file?
    Questo non modifica il file:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #define MAX 100
    
    int main (void)
    {
        FILE *puntaFile;
        char buffer [MAX+1];
        char nome [MAX+1];
        int scelta,i,l;
        int tot=0,tot2=0,c=0;
        char carattere;
    
        printf ("Inserire '1' per creare un file contenente un testo di 20 righe");
        printf ("\nInserire '2' per stampare il file");
        printf ("\nInserire '3' per contare il numero di occorrenze del carattere 'e' per ciascuna riga e in totale");
        printf ("\nInserire '4' per sostituire il primo carattere di ogni riga con il corrispondente maiuscolo");
        printf("\n\nInserisci la scelta: ");
        scanf("%d",&scelta);
    
        switch (scelta)
        {
            case 1:
                printf ("\nInserisci il nome del file da creare: ");
                fflush(stdin);
                gets(nome);
                if((puntaFile=fopen(nome,"w"))==NULL)
                {
                    printf("Erroe nell'apertura del programma.");
                    exit;
                }
                for(i=0;i<20;i++)
                {
                    printf("\nInserisci la riga %d: ",i+1);
                    gets(buffer);
                    fputs(buffer,puntaFile);
                    fputc((int)'\n',puntaFile);
                }
                fclose(puntaFile);
                break;
    
            case 2:
                printf("\nInserisci il nome del file da stampare: ");
                fflush(stdin);
                gets(nome);
                if ((puntaFile=fopen(nome,"r"))==NULL)
                {
                    printf("\nErrore nell\'apertura del file.");
                    exit;
                }
                while (fgets(buffer,MAX,puntaFile)!=NULL)
                printf ("%s",buffer);
                fclose (puntaFile);
                break;
    
            case 3:
                printf("\nInserisci il nome del file: ");
                fflush(stdin);
                gets(nome);
                if((puntaFile=fopen(nome,"r"))==NULL)
                {
                    printf ("\nIl file non puo\' essere aperto.");
                    exit;
                }
    
                while(fgets(buffer,MAX,puntaFile)!=NULL)
                {
                    l=strlen(buffer)-1;
                    for(i=0;i<l;i++)
                    {
                        if (buffer[i]=='e')
                        {
                            tot++;
                            tot2++;
                        }
                    }
                    c++;
                    printf("\nNella stringa %d ci sono %d 'e'.",c,tot);
                    tot=0;
                }
                printf("\nIn tutto il file ci sono %d 'e'.",tot2);
                fclose(puntaFile);
                break;
    
            case 4:
                printf("\nInserisci il nome del file: ");
                fflush(stdin);
                gets(nome);
                if((puntaFile=fopen(nome,"r"))==NULL)
                {
                    printf("\nIl file non puo\' essere aperto.");
                    exit;
                }
                while(fgets(buffer,MAX,puntaFile)!=NULL)
                {
                    buffer[0]=toupper(buffer[0]);
                    printf ("%s",buffer);
                }
                fclose (puntaFile);
                break;
    
            default:
            printf("\nL'utente non ha inserito alcuna scelta.");
            break;
        }
    }
    
  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    Dovrei modificare il file ma purtroppo non riesco, sono stato molto tempo su e sono giunto solo a questo codice (funzionante tutto tranne l'ultimo caso)
  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    Prima di tutto quando leggi il file lo fai riga per riga e non parola per parola, quindi solo la prima parola sarà in maiuscolo.

    In secondo luogo, non gestisci in maniera corretta il file in r+
    Quando leggi e scrivi un file devi tenere conto del fatto che la scrittura modifica il file e la lettura successiva ne risente.
    Per facilitare le cose, ti consiglio di leggere dal primo file e scrivere su un secondo file. Alla fine cancelli il primo e rinomini il secondo.
  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    Quindi per leggere anziché fgets dovrò usare fgetc?
    Mentre per il secondo punto non saprei come cancellare il primo e rinominarlo all'interno del codice (amesso che si possa fare poiché non ne sono a conoscenza)
  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    Beh ... strano che tu non sappia come gestire un file in r+ (update) o non sappia gestire la cancellazione del file. Come avresti dovuto risolvere il problema? L'unico modo sarebbe creare un secondo file lasciando inalterato quello originale.

    Comunque, ti suggerisco come modificare TUTTO il file in maiuscolo. Vedi tu come cambiare il codice per modificare solo le iniziali
    
    		char c;
    		while ((c = fgetc(puntaFile)) != EOF)
    		{
    			if (isalpha(c))
    			{
    				c = toupper(c);
    				fseek(puntaFile, -1, SEEK_CUR);
    				fputc(c, puntaFile);
    				fseek(puntaFile, 0, SEEK_CUR);
    			}
    			
    			printf("%c", c);
    		}
    
  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    Ho capito, grazie mille
  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    @less__
    I forum vengono letti da più persone rispetto a quelle che ci scrivono, e chi legge può restare deluso se una soluzione non viene mostrata.
    Utilizzando l'esempio di oregon ho scritto questa soluzione, funziona
    "4) Sostituire il primo carattere di ogni riga con il corrispondente maiuscolo."
    ma non so se in condizioni di testo particolari possa fallire.
    
            case 4:
                printf("\nInserisci il nome del file: ");
                fflush(stdin);
                gets(nome);
                if((puntaFile=fopen(nome,"r+"))==NULL)
                {
                    printf("\nIl file non puo\' essere aperto.");
                    exit;
                }
                char c;
                int m ;
                m=1;
                while ((c = fgetc(puntaFile)) != EOF)
                {
                    if (c=='\n')m=1;
                    if (isalpha(c))
                    {
                        if (m==1){
                        c = toupper(c);
                        fseek(puntaFile, -1, SEEK_CUR);
                        fputc(c, puntaFile);
                        fseek(puntaFile, 0, SEEK_CUR);
                        m=0;
                        }
                    }
    
                    printf("%c", c);
                }
                break;
    
  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    Mi domandavo, da inesperto sui file in C

    Perché la seconda seek() con spostamento 0 rispetto alla posizione iniziale?
  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    Rubik ha scritto:


    ho scritto questa soluzione
    Rubik ... avevo lasciato a _less il compito di scrivere il codice proprio per dargli modo di esercitarsi.

    Non ho scritto una soluzione completa appositamente.

    Fornire una soluzione non è educativo per chi studia, serve soltanto a far sapere al mondo che noi la sappiamo scrivere.
  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    StandardOil ha scritto:


    Mi domandavo, da inesperto sui file in C

    Perché la seconda seek() con spostamento 0 rispetto alla posizione iniziale?
    E' necessaria perché la modalità passa da scrittura (fputc) a lettura (fgetc).
  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    Ecco grazie, non lo sapevo


    Fosse capitato a me avrei sbagliato
  • Re: CONVERSIONE DA MINUSCOLO A MAIUSCOLO IN UN FILE

    StandardOil ha scritto:


    Ecco grazie, non lo sapevo
    Ad esempio, leggi su
    http://www.cplusplus.com/reference/cstdio/fopen

    dove dice

    For files open for update (those which include a "+" sign), on which both input and output operations are allowed, the stream shall be flushed (fflush) or repositioned (fseek, fsetpos, rewind) before a reading operation that follows a writing operation.

    The stream shall be repositioned (fseek, fsetpos, rewind) before a writing operation that follows a reading operation (whenever that operation did not reach the end-of-file).
Devi accedere o registrarti per scrivere nel forum
17 risposte