Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    25

    [C] Stampa su file una lista

    Ciao a tutti,
    sto facendo un programma in C che ad un certo punto prevede la stampa su un file di testo del contenuto di una cartella. Sapete dirmi come fare? In teoria la cartella dovrebbe essere diversa da quella in cui si trova il file del programma, ma andrebbe bene anche la lista della stessa cartella del file eseguibile.

    Grazie.

  2. #2
    Su che piattaforma stai lavorando?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    25
    Ciao, hai ragione. Sto su MAC e Linux!

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    every day above ground is a good one

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    25
    Grazie, quella parte l'avevo già letta, anche se non ho capito l'esempio. Posto come ho fatto:

    DIR *dp;
    FILE *list_fd;
    struct dirent *dir_p;
    char lista_file[20] = "Lista";

    int main()
    {


    //Directory di lavoro, se riuscissi dovrei poter usare una directory diversa
    getcwd(directory, sizeof(directory));

    //Apertura della directory
    dp = opendir(directory);
    printf("Directory aperta.\n");

    //Controllo
    if(dp == NULL) exit(1);

    printf("Funziona\n");
    dir_p = readdir(dp);
    //Apertura file della lista, se non esiste viene creato
    list_fd = fopen (lista_file, "w+b");

    //Scrittura lista nel file
    fwrite(dir_p -> d_name, (MAXLINE*sizeof(char)), 1, list_fd);

    closedir(dp);
    fclose(list_fd);
    }

    Il problema è che il file della lista oltre ai nomi dei file della cartella, stampa anche caratteri a caso mette tutto in riga e non in colonna.

  6. #6
    codice:
    //Scrittura lista nel file
    fwrite(dir_p -> d_name, (MAXLINE*sizeof(char)), 1, list_fd);
    È sbagliato, d_name è una normale stringa C, per cui la devi scrivere semplicemente fino al terminatore di stringa, altrimenti sicuramente scriverai anche "spazzatura" che non c'entra niente. Puoi semplicemente sostituire la fwrite con una normale fputs:
    codice:
    fputs(dir_p->d_name,list_fd);
    putc('\n');
    La seconda istruzione inserisce un ritorno a capo per separare le varie righe.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    25
    Grazie mille. Ho provato ad inserirlo nel programma, ma aprendo il file vedo che dentro c'è solo un puntino! O.o

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Devi mettere la readdir() dentro un ciclo, devi leggere i nomi dei file fino a quando c'è qualcosa da leggere dal directory stream dp. E non aprire il file in modalità di scrittura binaria, aprilo in modalità di scrittura testuale ( "w" come secondo argomenti di fopen() ).
    every day above ground is a good one

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    25
    Così?


    list_fd = fopen (lista_file, "a");

    while(dir_p != NULL)
    {
    dir_p = readdir(dp);
    fputs(dir_p -> d_name, list_fd);
    putc('\n', list_fd);
    }

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Lo hai provato? Comunque sì, compatta un po' caso mai

    codice:
    list_fd = fopen (lista_file, "w");
    
    while ((dir_p = readdir(dp) != NULL) {
        fputs(dir_p -> d_name, list_fd);
        fputc('\n', list_fd);
    }
    volendo potresti anche sostituire fputs() e fputc() con una fprintf() con tanto di '\n' direttamente. Ti consiglio comunque di controllare il valore di list_fd dopo la chiamata a fopen() ed assicurarti che non sia NULL (il che sarebbe indice di errori nell'apertura del file). Inoltre, giusto per la precisione, il valore restituito da fopen() non è un file descriptor ma un file stream, quindi il nome list_fd non è appropriato ma vabbè, è solo per precisare perché è facile confondersi tra concetti diversi
    every day above ground is a good one

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 © 2024 vBulletin Solutions, Inc. All rights reserved.