Newsgroup: it.comp.lang.c
Titolo: gestione dei files

Ciao,
Ho trovato sul libro questo programma, che, stando al libro, crea un
semplice file.
Il programma è questo:
http://i36.tinypic.com/dlltlz.jpg
se volete il codice, l'ho inserito alla fine del post.
La mia domanda è: dopo aver compilato questo codice, dove (in quale
parte dell'hard disk) viene creato il file clients.dat ?
Grazie
/* Create a sequential file */
#include <stdio.h>
int main()
{
   int account;     /* account number */
   char name[30];   /* account name */
   double balance;  /* account balance */
   FILE *cfPtr;     /* cfPtr = clients.dat file pointer */
   /* fopen opens file. Exit program if unable to create file  */
   if ( (cfPtr = fopen("clients.dat", "w")) == NULL )
   {
       printf("File could not be opened\n");
   }
   else
   {
       printf("Enter the account, name, and balance.\n");
       printf("Enter EOF to end input.\n");
       printf("?");
       scanf("%d%s%lf", &account, name, &balance);
       /* write account, name and balance into file with fprintf */
       while ( !feof(stdin) )
	   {
           fprintf( cfPtr, "%d %s %.2f\n", account, name, balance );
           printf( "?" );
           scanf("%d%s%lf", &account, name, &balance);
       }
       fclose( cfPtr ); /* fclose closes file */
   }
   system("pause");
   return 0; /* indicates successful termination */
}

 - Mostra testo citato -
Ok, questo problema l'ho risolto, ma EOF,... se digito -1 eppoi return
mi va nella riga nuova senza che il programma sia terminato,... non ci
capisco nulla!

Ok, questo problema l'ho risolto, ma EOF,... se digito -1 eppoi return
Il valore di EOF non va digitato. Quel valore serve solo
all'applicazione per riconoscere quando è finito il flusso di dati in
input. Devi digitare la combinazione relativa alla tua piattaforma
(CTRL+Z sotto DOS/Windows, CTRL+D sotto Linux). 
Ti consiglio comunque un manuale, queste sono veramente le basi.

andrew ha scritto:


EOF e' l'intero -1 non la string "-1".
Senza nessuna garanzia, se sei su una console windows prova con CTRL-Z

 Ti consiglio comunque un manuale, queste sono veramente le basi.
appunto, sui miei manuali, ne ho 2, c'era scritto -1. Leggo
testualmente: "Noi utilizzeremo EOF (che normalmente vale -1)".
Già che ci sei, saresti mica così gentile da consigliarmi un posto in
cui studiarmi come si fanno a gestire i file, perché io ho due
manuali, il kernigham ritche e un altro, in cui o non si spiega la
gestione files o la si tira via, col risultato che l'esempio che ho
riportato sopra e che ho copiato dal libro è documentato malissimo e
non ci capisco niente.
Grazie

manuali, il kernigham ritche e un altro,
KernighaN.

 manuali, il kernigham ritche e un altro,
[Lo so che era indirizzato ad Andrea ma mi impiccio].
A me sembra che il K&R lo spieghi abbastanza bene.
Perche' non provi a scrivere programmi del tipo:
"Creare un file di testo con i primi 100 numeri"
"Creare un file di testo con i primi 100 numeri dispari"
"Aprire un file di testo e mostrarlo alla console"
"Aprire un file di testo e stampare una riga si' ed una no"
In questo modo puoi concentrarti sulle funzioni che ti servono:
fopen, fclose, fprintf, fgets.
Con queste quattro puoi fare quasi qualsiasi cosa sui file. Le altre 
funzioni le puoi studiare quando hai capito come usare queste prime quattro.
Se poi hai domande piu' specifiche basta chiedere.
Remo.D


Grazie.
Studiandomi K&R ho capito che FILE è una Tag, precisamente da qualche
parte in stdio.h ci sarà
typedef struct {
..
..
} FILE;
Inoltre il codice
FILE* cfPtr;
dichiara che cfPtr è il nome di una variabile di tipo puntatore a
FILE. In particolare cfPtr potrà contenere l'indirizzo di una
variabile di tipo FILE.
Ma che cosa è questa struttura FILE? Dovessi spiegarlo a qualcuno non
sarei in grado..

 sarei in grado..
Non ti importa sapere cos'č, ma come si usa.
E.

 E.
quando studiavo lo spazio V** desideravo studiare la teoria dei
funtori ad esso intrinsecamente legata, a mio modo di vedere. E la
studia. Scherzi a parte, che bei ricordi...
Ciao

 Ma che cosa è questa struttura FILE?
È una struttura opaca. È *giusto* che tu non sappia come è fatta e
tipicamente non vorresti usarne comunque l'implementazione.
È un handle ("maniglia", punto di accesso) per manipolare un file.
Punto.
-- 
-riko

On 27 Set, 22:13, "Remo D." <rd> wrote:

Per aprire un file di testo e mostrarlo alla console (la console è il
monitor?) devo utilizzare la funzione fscanf(nome del puntatore del
file, stringa di formato carattere, indirizzo della/2 variabile/i) ?
Come faccio poi a stampare una riga sì ed  una no?
Grazie

sarei in grado..
Ti basterebbe dirgli che è una struttura in cui vengono conservate
informazioni di stato sul file aperto. Che cosa ci sia dentro nello
specifico non ti interessa (e credo che lo standard neanche imponga
alcunché a proposito). E' una tipica struttura opaca.

 alcunché a proposito). E' una tipica struttura opaca.
Che cosa sono le info di "stato" sul file aperto?
Grazie a tutti coloro che quieteranno la mia curiosità :-)

 Come faccio poi a stampare una riga sì ed  una no?
Potresti usare una variabile che ti dice se hai stampato la riga 
precedente. Qualcosa del tipo x^=1 (se hai già studiato le operazioni 
sui bit) o x = x?0:1 (se hai già studiato l'operatore condizionale).
Prova, e posta il codice se qualcosa non ti torna.
Remo.D


scusa ma perché usare la fprintf se devo leggere da file? Io userei la
printf per stampare su monitor..


 printf per stampare su monitor..
Infatti ho scritto:  "usa la fgets() per leggere dal file e la fprintf() 
per stampare il testo"
Remo.

 Come faccio poi a stampare una riga sě ed  una no?
Leggi tutte le righe e incrementa un contatore ad ogni riga. Se il 
contatore č dispari stampi la riga, sennň no.
E.

un carattere.
Concordo, oltretutto č la piů sicura.

On 27 Set, 22:13, "Remo D." <rd> wrote:

Quando hai detto
"Aprire un file di testo e stampare una riga si' ed una no"
intendevi dire di scrivere un pgm che apre un file di testo e stampa
una riga si' ed una no in un altro file di testo ? Oppure nello stesso
file? In quest'ultimo caso sono ammesse righe vuote?
Grazie

 file? In quest'ultimo caso sono ammesse righe vuote?
Intendevo su un'altro file. Se hai voglia di provare, riformulo il 
problema con maggiore precisione:
------
Scrivere il programma   "altern"  che legge un file di testo e ne stampa 
una riga si ed una riga no.
Il programma deve essere lanciato da linea di comando con le seguenti 
opzioni:
   altern [-p] [filein|-] [fileout]
Se il flag "-p" non è presente, vengono stampate solo le righe pari, 
altrimenti solo le dispari. Le righe vengono contate a partire da 1.
Se l'argomeno "filein" è assente (oppure è uguale alla stringa "-") il 
file viene letto da stdin. Altrimenti l'argomento è il nome del file da 
aprire in lettura.
Se l'argomento "fileout" è assente, il file viene inviato su stdout, 
altrimenti "fileout" è il nome del file da creare.
-----
Se ti sembra troppo complesso, scrivi solo il programma che legge da 
stdin e scrive su stdout le righe dispari (la 1a, la 3a, etc).
Usa solo fopen, fclose, fgets e fprintf, nient'altro (quindi niente 
printf()).
Remo.D
P.S. Modificare un fili "in loco" è molto piu' complesso ed inefficente. 
A meno di casi molto particolari (file enormi ad esempio), in genere si 
legge da un file e se ne crea un'altro.


io avevo scritto:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i;
    char str[300];
    FILE *pf1, *pf2;
    pf1 = fopen("esempio.txt", "r");
    pf2 = fopen("esempiocut.txt", "w");
    i = 0;
    while(!feof(pf1))
    {
        fgets(str, 157, pf1);
        if ((i % 2) == 0) // sse i e` pari
            fprintf(pf2, "%s", str);
            i++;
    }
    fclose(pf1);
    fclose(pf2);
    system("pause");
    return 0;
}
In particolare, dove deve essere presente il flag "-p", se presente?
In che senso scrive su stdout? Che cosa significa inviare un file su
stdout?
Ti devo dire la verità non ho capito cosa sono questi stdin, stdout,
stderr..
Grazie

 In particolare, dove deve essere presente il flag "-p", se presente?
Sulla riga di comando. Probabilmente non la stai usando, visto che hai 
dovuto mettere system("pause")
E.

 E.

 scusa.. che cosa è la riga di comando?
Hai presente la finestra nera in cui vedi l'esecuzione del tuo 
programma? Quella è l'interfaccia a linea di comando.
La trovi nel menu "Start/Programmi/Accessori/Prompt dei comanandi" 
(oppure "Start/Esegui/cmd.exe").
[nel messaggio precedente]
 > Ti devo dire la verità non ho capito cosa sono questi stdin, stdout,
 > stderr..
Un noto investigatore avrebbe detto: "lo supponevo, lo suppo" :)
Il C stabilisce un modello di I/O basato su file e stabilisce che ,per 
ogni programma, vengano aperti 3 file di testo:
  * "stdin" (da cui arriverà l'input),
  * "stdout" (dove andrà inviato l'output)
  * "stderr" (dove andranno inviati i messaggi di errore).
Quando sei sul prompt stdin corrisponde alla tastiera, stdout al monitor 
e stderr pure.
Nel mio K&R (2nd ed) in inglese è tutto spiegato nel capitolo 7, non so 
se hai la versione in Italiano e se la numerazione dei capitoli e' stata 
rispettata.
 > In particolare, dove deve essere presente il flag "-p", se presente?
Su linea di comando i dati vengo passati al programma attraverso un 
vettore di stringhe. Cerca "argc" e "argv" sul tuo manuale (da me è il 
paragrafo 5.10).
Si puo' fare anche da IDE ma è piu' contorto, che compilatore stai usando?
Remo.D

 Remo.D
Grazie