18.08.2013 Views

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

funzionamento: la differenza consiste nel fatto che è possibile specificare su quale file leggere e<br />

scrivere (anche i file standard stdin e stdout.<br />

Le due funzioni sono infatti definite come segue<br />

int fprintf(FILE *stream, const char *format, ...);<br />

int fscanf(FILE *stream, const char *format, ...);<br />

La differenza con le funzioni scanf e printf è che il primo parametro rappresenta il file sul quale<br />

scrivere (e leggere).<br />

Il programma seguente legge da standard input, con possibilità di redirezione dello standard<br />

input, una matrice di 4 colonne <strong>per</strong> un massimo di 5 righe. Il programma scrive su standard<br />

output la matrice moltiplicata <strong>per</strong> 2.<br />

#include <br />

#include <br />

#define N (5)<br />

int main()<br />

{<br />

float m[N][4];<br />

int i;<br />

}<br />

i = 0;<br />

while (!feof(stdin)) {<br />

fscanf(stdin, "%f %f %f %f",<br />

&m[i][0], &m[i][1], &m[i][2], &m[i][3]);<br />

fprintf(stdout, "%f %f %f %f\n",<br />

2 * m[i][0], 2 * m[i][1], 2 * m[i][2], 2 * m[i][3]);<br />

i++;<br />

}<br />

return 0;<br />

Per controllare la terminazione dell’input viene utilizzata la funzione feof, la quale ritorna<br />

non-zero se l’indicatore di fine file è impostato.<br />

Anche in questo caso, il programma non effettua controlli sul fatto che il numero di righe<br />

lette sia minore o uguale della dimensione della matrice.<br />

12.9 Esempio di lettura di matrici con fgets e sscanf<br />

I programmi illustrati nelle sezioni 12.7 e 12.8 assumevano che il numero di colonne fosse noto a<br />

priori, e quindi era possibile impostare l’istruzione sscanf of fscanf con il numero appropriato<br />

di parametri <strong>per</strong> leggere tutti i dati su ciascuna linea.<br />

Quando il numero di parametri su una linea non è noto a priori oppure è sconveniente elencare<br />

tutti i parametri uno <strong>per</strong> uno, è possibile utilizzare un approccio più adatto e generale.<br />

Il tipico esempio è quello della lettura di una matrice da un file (o standard input) che non<br />

abbia un numero di colonne noto a priori. In tal caso, non è possibile elencare esplicitamente le<br />

variabili nell’istruzione di scansione della stringa di input.<br />

122

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!