Newsgroup: it.comp.lang.c
Titolo: fscanf() fprintf()

Salve a tutti
Cosa fanno queste istruzioni?
Dando x scontato tutte le istruzioni precedenti e seguenti il codice
sottoscritto.
fscanf(stdin, "%s%d%d%d\n", nome, &codice_a, &modifica, &num);
fscanf(stdin, "%*c");
printf("%d", fprintf(pf, "%s%d%d%d\n", nome, codice_a, modifica, num));
Grazie

printf("%d", fprintf(pf, "%s%d%d%d\n", nome, codice_a, modifica, num));
Scrive il valore intero, indicante il risultato della funzione "fprintf()" che
si occupa di spedire nome, codice_a, modifica, num e un carattere di "a capo" al
file, specificato con il puntatore "pf".
Skyscraper (apprezzatelo adesso : eviterete la coda)
----------------------------------------------------
 
andrea_...@bigfoot.com
----------------------------------------------------
--
Posted from 
itaca.ulysse.it
 [195.223.254.1]
via Mailgate.ORG Server - 
http://www.mailgate.org

 printf("%d", fprintf(pf, "%s%d%d%d\n", nome, codice_a, modifica, num));
Scrive una stringa e tre interi sul file pf e poi stampa sullo standard
output un numero corrispondente a quanti caratteri ha scritto sul file.
EMG

 tutto e' file :).
Scusa se mi permetto di corregerti, ma lo stdin non e' la tastiera? e il
video lo stdout?
Ciao, Luca.
-- 
*******************************************************
  "C'e' un vecchio detto a riguardo delle reti che    
  recita: i problemi di banda possono essere risolti  
  con il denaro. I problemi di latenza sono piu' dif- 
  ficili poiche' la velocita' della luce e' una cos-  
  tante e non e' possibile corrompere Dio."           
 
                                     David Clark, MIT 
  Reply to 
bia...@maganet.net
*******************************************************

video lo stdout?
Si, stdin e' la tastiera, io intendevo che tutto cio' che si digita e che
compare a video viene acquisito. 
Si la fonte e' in effetti la tastiera.


Legge dallo standard input una stringa e tre interi.
Dove lo "stdin" corrisponde alla tastiera? Ma se io ometto "stdin", l'input
non lo riceverà comunque dalla tastiera?
Mr_G_

e' un puntatore a caratteri),
Si e quindi è gia un'array e non deve essere preceduto dall'operatore &.
Questo perchè il nome di un'array senza indici equivale
all'indirizzo del primo elemento.
Mr_G_


Credo di No.
Infatti se il prototipo della fscanf e' qualcosa del tipo seguente
(presa dal manuale di Linux)
int fscanf( FILE *stream, const char *format, ...);
significa  che la fscanf come primo parametro si aspetta un puntatore
a FILE. Quindi  il "corpo" della fscanf trattera' stream (il primo
parametro) come un puntatore ad una zona di memoria in cui si trova
una struttura FILE.
In quanto segue immagino che da qualche parte ci sia qualcosa del tipo
int codice_a, modifica, num;
char nome[1000];
Se tu ometti stdin e scrivi ad esempio
   fscanf("%s%d%d%d\n", nome, &codice_a, &modifica, &num);
la fscanf considerera' probabilmente l'indirizzo della stringa "%s%d%d%d\n"
come se fosse l'indirizzo della struttura FILE (effettuando probabilmente
una conversione tra char * e FILE *), nome come se fosse la
stringa di formattazione e i seguenti parametri come gli indirizzi delle
variabili da leggere;
quindi, omettendo stdin, fscanf tentera' di leggere da un "file" individuato
dalla zona di memoria che parte dall'indirizzo della stringa "%s%d%d%d\n"
(considerando tale indirizzo come indirizzo a partire dal quale e' allocata
una struttura FILE). Inoltre fscanf tentera' di capire quante sono e di che
tipo sono le variabili che devono essere settate con i valori letti in
base a quella che lei (la fscanf) considera una  stringa di formattazione,
ovvero name (e chissa' cosa contiene name nel momento in cui viene eseguita
la fscanf).
Il comportamento del programma risulta quindi del tutto imprevedibile.
In ogni caso io ho provato a compilare il seguente codice con il
gcc 2.7.2.3
#include <stdio.h>
int main(int argc, char *argv[]) {
    char nome[1000];
    int codice_a, modifica, num;
    fscanf("%s%d%d%d\n", nome, &codice_a, &modifica, &num);
}
e ottengo il seguente messaggio
warning: passing arg 1 of `fscanf' from incompatible pointer type
L'eseguibile viene comunque prodotto.
Eseguendolo sul mio sistema ottengo semplicemente che l'esecuzione del
programma non si blocca in corrispondenza della fscanf ed il programma
termina senza modificare i valori di codice_a, num, ecc..
Pero', a secoda di cosa c'e' in memoria nel sistema quando
viene eseguito il programma e a seconda di come viene inizializzata
name  potrei anche ottenere un Segmentation fault.
Marco Guidi
 

non lo ricever` comunque dalla tastiera?
Con fscanf() non puoi omettere lo stream.
In ogni caso, stdin sta per "standard input" il che significa che se ometti la
fonte dei dati viene assunto stdin.


 non lo riceverà comunque dalla tastiera?
Si, se usi la funzione scanf() al posto della fscanf().
EMG