Contenuto principale

fprintf

Scrivere i dati in un file di testo

Descrizione

fprintf(fileID,formatSpec,A1,...,An) applica formatSpec tutti gli elementi degli array A1,...An in ordine di colonna e scrive i dati in un file di testo. fprintf utilizza lo schema di codifica specificato nella chiamata a fopen.

esempio

fprintf(formatSpec,A1,...,An) formatta i dati e visualizza i risultati sullo schermo.

esempio

nbytes = fprintf(___) restituisce il numero di byte che scrive fprintf utilizzando uno qualsiasi degli argomenti di input nelle sintassi precedenti.

esempio

Esempi

comprimi tutto

Stampare sullo schermo valori numerici multipli e testo letterale.

A1 = [9.9, 9900];
A2 = [8.8,  7.7 ; ...
      8800, 7700];
formatSpec = 'X is %4.2f meters or %8.3f mm\n';
fprintf(formatSpec,A1,A2)
X is 9.90 meters or 9900.000 mm
X is 8.80 meters or 8800.000 mm
X is 7.70 meters or 7700.000 mm

%4.2f nell'input formatSpec specifica che il primo valore in ciascuna riga di output è un numero in virgola mobile con una larghezza del campo di quattro cifre, incluse le due cifre dopo il punto decimale. %8.3f nell'input formatSpec specifica che il secondo valore in ciascuna riga di output è un numero in virgola mobile con una larghezza del campo di otto cifre, incluse le tre cifre dopo il punto decimale. \n è un carattere di controllo che inizia una nuova riga.

Convertire esplicitamente i valori a doppia precisione con frazioni in valori interi.

a = [1.02 3.04 5.06];
fprintf('%d\n',round(a));
1
3
5

%d nell'input formatSpec stampa ciascun valore del vettore round(a), come un numero intero con segno. \n è un carattere di controllo che inizia una nuova riga.

Scrivere una breve tabella della funzione esponenziale in un file di testo chiamato exp.txt.

x = 0:.1:1;
A = [x; exp(x)];

fileID = fopen('exp.txt','w');
fprintf(fileID,'%6s %12s\n','x','exp(x)');
fprintf(fileID,'%6.2f %12.8f\n',A);
fclose(fileID);

La prima chiamata a fprintf stampa il testo dell'intestazione x e exp(x), mentre la seconda chiamata stampa i valori della variabile A.

Se si intende leggere il file con il Blocco note di Microsoft®, utilizzare '\r\n' anziché '\n' per passare a una nuova riga. Ad esempio, sostituire le chiamate a fprintf con quanto segue:

fprintf(fileID,'%6s %12s\r\n','x','exp(x)');
fprintf(fileID,'%6.2f %12.8f\r\n',A);

Le funzioni di importazione di MATLAB®, tutte le applicazioni di UNIX® e Microsoft Word e WordPad riconoscono '\n' come indicatore di nuova riga.

Visualizzare il contenuto del file con il comando type.

type exp.txt
     x       exp(x)
  0.00   1.00000000
  0.10   1.10517092
  0.20   1.22140276
  0.30   1.34985881
  0.40   1.49182470
  0.50   1.64872127
  0.60   1.82211880
  0.70   2.01375271
  0.80   2.22554093
  0.90   2.45960311
  1.00   2.71828183

Scrivere dati in un file e restituire il numero di byte scritti.

Scrivere un array di dati A in un file e ottenere il numero di byte che scrive fprintf.

A = magic(4);

fileID = fopen('myfile.txt','w');
nbytes = fprintf(fileID,'%5d %5d %5d %5d\n',A)
nbytes = 
96

La funzione fprintf ha scritto 96 byte nel file.

Chiudere il file.

fclose(fileID);

Visualizzare il contenuto del file con il comando type.

type('myfile.txt')
   16     5     9     4
    2    11     7    14
    3    10     6    15
   13     8    12     1

Visualizzare un collegamento ipertestuale (Il sito web di MathWorks) sullo schermo.

url = 'https://www.mathworks.com';
sitename = 'The MathWorks Web Site';

fprintf('<a href = "%s">%s</a>\n',url,sitename)

%s nell'input formatSpec indica che i valori delle variabili url e sitename, devono essere stampati come testo.

Argomenti di input

comprimi tutto

Identificatore di file, specificato in uno dei seguenti modi:

  • Un identificatore di file ottenuto da fopen. fprintf non supporta la scrittura su URL di Internet.

  • 1 per l'output standard (lo schermo).

  • 2 per l'errore standard.

Tipi di dati: double

Formato dei campi di output, specificato utilizzando gli operatori di formattazione. formatSpec può inoltre includere testo ordinario e caratteri speciali.

Se formatSpec include testo letterale che rappresenta caratteri di escape, come \n, fprintf traduce i caratteri di escape.

formatSpec può essere un vettore di caratteri tra virgolette singole o uno scalare di stringa.

Operatore di formattazione

Un operatore di formattazione inizia con un segno di percentuale % e termina con un carattere di conversione. Il carattere di conversione è necessario. Opzionalmente, è possibile specificare operatori di identificazione, flag, larghezza del campo, precisione e sottotipo tra % e il carattere di conversione. (Gli spazi non sono validi tra gli operatori e sono qui mostrati solo per motivi di leggibilità).

Schematic of formatting operator characters.

Carattere di conversione

Questa tabella mostra i caratteri di conversione per formattare i dati numerici e di caratteri come testo.

Tipo di valoreConversioneDettagli

Intero, con segno

%d o %i

Base 10

Intero, senza segno

%u

Base 10

%o

Base 8 (ottale)

%x

Base 16 (esadecimale), lettere minuscole af

%X

Come %x, lettere maiuscole AF

Numero in virgola mobile

%f

Notazione in virgola fissa (utilizzare un operatore di precisione per specificare il numero di cifre dopo il punto decimale).

%e

Notazione esponenziale, ad esempio 3.141593e+00 (utilizzare un operatore di precisione per specificare il numero di cifre dopo il punto decimale).

%E

Come %e, ma in lettere maiuscole, ad esempio 3.141593E+00 (utilizzare un operatore di precisione per specificare il numero di cifre dopo il punto decimale).

%g

Il più compatto tra %e e %f, senza zeri finali (utilizzare un operatore di precisione per specificare il numero di cifre significative).

%G

Il più compatto tra %E e %f, senza zeri finali (utilizzare un operatore di precisione per specificare il numero di cifre significative).

Caratteri o stringhe

%c

Carattere singolo

%s

Vettore di caratteri o array di stringhe. Il tipo di testo di output è uguale al tipo di formatSpec.

Operatori opzionali

Gli operatori opzionali di identificazione, flag, larghezza del campo, precisione e sottotipo definiscono ulteriormente il formato del testo di output.

  • Identificatore

    Ordine di elaborazione degli argomenti di input della funzione. Utilizzare la sintassi n$, dove n rappresenta le posizioni degli altri argomenti di input nella chiamata di funzione.

    Esempio: ('%3$s %2$s %1$s %2$s','A','B','C') stampa gli argomenti di input 'A', 'B', 'C' come segue: C B A B.

    Nota: se un argomento di input è un array, non è possibile utilizzare gli identificatori per specificare particolari elementi dell'array da quell'argomento di input.

  • Flag

    '–'

    Allinea a sinistra.
    Esempio: %-5.2f
    Esempio: %-10s

    '+'

    Stampa sempre un carattere segno (+ o -) per qualsiasi valore numerico.
    Esempio: %+5.2f
    Allinea testo a destra.
    Esempio: %+10s

    ' '

    Inserisce uno spazio prima del valore.
    Esempio: % 5.2f

    '0'

    Riempie la larghezza del campo con zeri prima del valore.
    Esempio: %05.2f

    '#'

    Modifica le conversioni numeriche selezionate:

    • Per %o, %x o %X, stampa il prefisso 0, 0x o 0X.

    • Per %f, %e o %E, stampa il punto decimale anche quando la precisione è 0.

    • Per %g o %G, non rimuove gli zeri finali o il punto decimale.

    Esempio: %#5.0f

  • Larghezza del campo

    Numero minimo di caratteri da stampare. L'operatore di larghezza del campo può essere un numero o un asterisco (*) per riferirsi a un argomento di input.

    Quando si specifica * come operatore di larghezza del campo, gli altri argomenti di input devono fornire sia una larghezza che un valore da stampare. Le larghezze e i valori possono essere coppie di argomenti o coppie all'interno di un array numerico. Con * come operatore di larghezza del campo, è possibile stampare valori diversi con larghezze diverse.

    Esempio: gli argomenti di input ('%12d',intmax) sono equivalenti a ('%*d',12,intmax).

    Esempio: gli argomenti di input ('%*d',[2 10 5 100]) restituiscono '10 100', con due spazi allocati per 10 e cinque spazi allocati per 100. Come alternativa, è possibile specificare le larghezze e i valori dei campi come argomenti multipli, come in ('%*d',2,10,5,100).

    La funzione riempie la larghezza del campo con spazi prima del valore, a meno che non sia specificato diversamente dai flag.

  • Precisione

    Per %f, %e o %E

    Numero di cifre a destra del punto decimale
    Esempio: '%.4f' stampa pi come '3.1416'

    Per %g o %G

    Numero di cifre significative
    Esempio: '%.4g' stampa pi come '3.142'

    L'operatore di precisione può essere un numero o un asterisco (*) per riferirsi a un argomento.

    Quando si specifica * come operatore di precisione del campo, gli altri argomenti di input devono fornire sia una precisione che un valore da stampare. Le precisioni e i valori possono essere coppie di argomenti o coppie all'interno di un array numerico. Con * come operatore di precisione, è possibile stampare valori diversi con precisioni diverse.

    Quando si specificano *.* come operatori di larghezza e di precisione del campo, è necessario specificare le larghezze, le precisioni e i valori del campo come terzine.

    Esempio: gli argomenti di input ('%.4f',pi) sono equivalenti a ('%.*f',4,pi).

    Esempio: gli argomenti di input ('%6.4f',pi) sono equivalenti a ('%*.*f',6,4,pi).

    Esempio: gli argomenti di input ('%*.*f',6,4,pi,9,6,exp(1)) restituiscono '3.1416 2.718282', con 9 e 6 come larghezza del campo e precisione per l'output di exp(1).

    Nota

    Se si specifica un operatore di precisione per i valori in virgola mobile che supera la precisione del tipo di dati numerici di input, i risultati potrebbero non corrispondere ai valori di input con la precisione specificata. Il risultato dipende dall'hardware e dal sistema operativo del computer.

  • Sottotipi

    È possibile utilizzare un operatore di sottotipo per stampare un valore in virgola mobile come valore ottale, decimale o esadecimale. L'operatore di sottotipo precede immediatamente il carattere di conversione. Questa tabella mostra le conversioni che possono utilizzare i sottotipi.

    Tipo di valore di input

    Sottotipo e carattere di conversione

    Tipo di valore di output

    Numero in virgola mobile

    %bx o %bX
    %bo
    %bu

    Valore esadecimale, ottale o decimale a doppia precisione
    Esempio: %bx stampa pi come 400921fb54442d18

    %tx o %tX
    %to
    %tu

    Valore esadecimale, ottale o decimale a precisione singola
    Esempio: %tx stampa pi come 40490fdb

Testo prima o dopo gli operatori di formattazione

formatSpec può anche includere testo ulteriore prima di un segno di percentuale % o dopo un carattere di conversione. Il testo può essere:

  • Testo ordinario da stampare.

  • Caratteri speciali che non possono essere inseriti come testo normale. Questa tabella mostra come rappresentare i caratteri speciali in formatSpec.

    Carattere speciale

    Rappresentazione

    Virgolette singole

    ''

    Carattere percentuale

    %%

    Barra retroversa

    \\

    Allarme

    \a

    Backspace

    \b

    Avanzamento pagina

    \f

    Nuova riga

    \n

    Ritorno a capo

    \r

    Tabulazione orizzontale

    \t

    Tabulazione verticale

    \v

    Carattere il cui valore numerico Unicode® può essere rappresentato dal numero esadecimale N

    \xN

    Esempio: fprintf('\x5A') restituisce 'Z'

    Carattere il cui valore numerico Unicode può essere rappresentato dal numero ottale N

    \N

    Esempio: fprintf('\132') restituisce 'Z'

Comportamenti significativi delle conversioni con gli operatori di formattazione

  • Se si specifica una conversione che non si adatta ai dati, come una conversione di testo per un valore numerico, MATLAB sovrascrive la conversione specificata e utilizza %e.

    Esempio: '%s' converte pi in 3.141593e+00.

  • Se si applica una conversione di testo (%c o %s) a valori interi, MATLAB converte i valori che corrispondono a codici di carattere validi in caratteri.

    Esempio: '%s' converte [65 66 67] in ABC.

Array numerici o di caratteri, specificati come scalare, vettore, matrice o array multidimensionale.

Tipi di dati: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char

Argomenti di output

comprimi tutto

Numero di byte che scrive fprintf, restituito come uno scalare. Quando si scrive su un file, nbytes è determinato dalla codifica dei caratteri. Quando si stampano i dati sullo schermo, nbytes è il numero di caratteri visualizzati sullo schermo.

Suggerimenti

  • Gli specificatori di formato per le funzioni di lettura sscanf e fscanf differiscono dai formati per le funzioni di scrittura sprintf e fprintf. Le funzioni di lettura non supportano un campo di precisione. Il campo della larghezza specifica un minimo per la scrittura, ma un massimo per la lettura.

  • Se si specifica un operatore di formattazione o un carattere speciale non valido, fprintf stampa tutto il testo fino all'operatore o al carattere non valido e scarta il resto.

    Esempio: se formatSpec è 'value = %z', fprintf stampa 'value =' in quanto %z non è un operatore di formattazione.

    Esempio: se formatSpec è 'character \x99999 = %s', fprintf stampa 'character' in quanto \x99999 non è un carattere speciale valido.

Riferimenti

[1] Kernighan, B. W., and D. M. Ritchie, The C Programming Language, Second Edition, Prentice-Hall, Inc., 1988.

[2] ANSI specification X3.159-1989: “Programming Language C,” ANSI, 1430 Broadway, New York, NY 10018.

Funzionalità estese

Cronologia versioni

Introduzione prima di R2006a

Go to top of page