Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: [c] creare cartelle

  1. #1
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85

    [c] creare cartelle

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <dir.h>
    #define max 200
    
    int main()
    {
        int NumeroInizio,i,NumeroUltimo,Pagina;
        char risposta,Percorso[max];
    
        do{
        printf("Ciao. Inserisci il primo esercizio e l'ultimo\n([primo numero] [ultimo numero] [pagina]): ");
        scanf("%d %d %d",&NumeroInizio,&NumeroUltimo,&Pagina);
        printf("\nInserisci il percorso dove creare le CARTELLE: ");
        scanf("%s",&Percorso[max]);
    
        printf("Confermi la creazione delle directory: %s/ex %d pag %d\na ex %d pag %d ?(s/n) ",Percorso,NumeroInizio,Pagina,NumeroUltimo,Pagina);
        risposta=getche();
        printf("\n");
        }while(risposta=='n');
    
        i=NumeroInizio;
        while(i<=NumeroUltimo)
        {
            system("mkdir %s\ex %d-%d",Percorso,i,Pagina);
            i++;
        }
        return 0;
    }
    naturalmente l'errore sta in mkdir che io ho usato come printf("")
    SO: Windows 7

  2. #2
    Potresti costruire la stringa con sprintf, ma in generale eviterei la system in blocco, usa la syscall mkdir.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85
    grazie.
    ho scelto di usare la seconda opzione, ma c'è sempre lo stesso problema: come metto i parametri (come faccio a mettere il percorso che ho inserito io e poi la variabile i)?
    SO: Windows 7

  4. #4
    Originariamente inviato da MItaly
    Potresti costruire la stringa con sprintf
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85
    dici che dovrei usare sprintf?

    EDIT: non riuscito. esempi coerenti, per favore?
    SO: Windows 7

  6. #6
    codice:
    char buffer[PATH_MAX];
    if(snprintf(buffer, sizeof(buffer),"%s/ex %d-%d",Percorso,i,Pagina)<=0)
    {
        puts("Errore: impossibile creare la stringa del percorso");
        return EXIT_FAILURE;
    }
    Per inciso, il resto del programma contiene diversi errori o imprecisioni; ti scrivo una versione corretta:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <ctype.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    
    int main()
    {
        int NumeroInizio,i,NumeroUltimo,Pagina;
        char Risposta,PercorsoBase[PATH_MAX],PercorsoCompleto[PATH_MAX];
    
        do
        {
            printf("Ciao. Inserisci il primo esercizio e l'ultimo\n([primo numero] [ultimo numero] [pagina]): ");
            /* scanf retituisce il numero dei campi correttamente acquisiti;
             se qui è diverso da 3 almeno uno non è stato inserito bene */
            if(scanf("%d %d %d",&NumeroInizio,&NumeroUltimo,&Pagina)!=3)
            {
                /* Se non hai formattazioni strane da fare puts è più rapida di printf,
                 e ti mette al riparo da potenziali problemi */
                puts("Dati non inseriti correttamente, riprova.");
                continue;
            }
            printf("\nInserisci il percorso dove creare le CARTELLE: ");
            /* scanf("%s", ...) è potenziale causa di buffer overflow (senza contare
             che stavi specificando come secondo argomento una roba inguardabile) */
            if(fgets(PercorsoBase, sizeof(PercorsoBase))==NULL)
            {
                /* Se fgets restituisce NULL ci sono stati problemi di lettura;
                 dato che qui non ci si può più fare nulla, esce e segnala l'errore grave sullo standard error */
                fputs("Errore di lettura.", stderr);
                /* EXIT_FAILURE è una macro che specifica il codice di errore di default
                 per l'esecuzione terminata con errori */ 
                return EXIT_FAILURE;
            }
            printf("Confermi la creazione delle directory: %s/ex %d pag %d\na ex %d pag %d ?(s/n) ",Percorso,NumeroInizio,Pagina,NumeroUltimo,Pagina);
            risposta=getche();
            putchar('\n');
        } while(tolower(risposta)!='s'); /* tolower converte le maiuscole in minuscole; inoltre confrontando per uguaglianza con 'n', nel caso in cui l'utente avesse inserito altri caratteri sarebbe andato avanti lo stesso */
    
        /* Il for è molto più adatto del while in questo contesto */
        for(i=NumeroInizio; i<=NumeroUltimo; i++)
        {
            if(snprintf(PercorsoCompleto, sizeof(buffer),"%s/ex %d-%d",PercorsoBase,i,Pagina)<=0)
            {
                fputs("Impossibile creare la stringa del percorso.", stderr);
                return EXIT_FAILURE;
            }
            /* Crea la directory con i permessi di default */
            if(mkdir(PercorsoCompleto,PERM_DIRECTORY)==-1)
            {
                /* Si è verificato un errore, lo stampa preceduto dal testo specificato */
                perror("Impossibile creare la cartella");
                return EXIT_FAILURE;
            }
        }
        /* EXIT_SUCCESS è una macro che specifica il codice di errore di
         default per l'esecuzione terminata correttamente */
        return EXIT_SUCCESS;
    }
    Nota che non l'ho provato, ma dovrebbe andare.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85
    grazie. correzione molto dettagliata,anche per la gestione degli errori che non ho mai affrontato. farò sapere.
    a cosa serve "contunue"?
    p.s.:quante librerie usate! o_o
    SO: Windows 7

  8. #8
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da spode
    a cosa serve "contunue"?
    Salta direttamente alla prossima iterazione.

    Originariamente inviato da spode
    p.s.:quante librerie usate! o_o
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  9. #9
    Originariamente inviato da spode
    p.s.:quante librerie usate! o_o
    So di essere noioso, ma non sono librerie, sono header o file di inclusione. Le librerie sono un'altra cosa.
    Comunque, ognuno ha il suo perché (le spiegazioni sono riferite a questo programma in particolare, poi servono anche a molte altre cose):
    • stdio.h per le funzioni di input/output;
    • stdlib.h per i codici di uscita;
    • limits.h per PATH_MAX;
    • ctype.h per tolower;
    • sys/stat.h e sys/types.h per mkdir.

    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85
    grazie. io,al posto di continue, usavo break...non so se dico una cosa stupida (se così fosse, la risposta sarebbe: sto impando e sono agli inizi)
    SO: Windows 7

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.