MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Ieșire formatată

Pachetul fmt oferă o serie de funcționalități pentru citirea și scrierea fișierelor. Acest pachet furnizează mai multe funcții pentru scrierea datelor într-un obiect care implementează interfața io.Writer: fmt.Fprint(), fmt.Fprintln() și fmt.Fprintf().

Funcțiile Fprint și Fprintln

Funcțiile Fprint și Fprintln au o definiție aproximativ similară:

func Fprint(w io.Writer, a ...interface{}) (n int, err error)
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)

Primul parametru este un obiect care implementează interfața io.Writer. Al doilea parametru reprezintă un set de obiecte care sunt scrise în flux. Ambele funcții returnează numărul de octeți scriși și informațiile despre eroare, dacă există. Diferența dintre funcția Fprintln este că aceasta adaugă un caracter de sfârșit de linie atunci când scrie, ceea ce înseamnă că scrie un șir de caractere. De exemplu:

package main
import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Create("confeve.txt")
    if err != nil{
        fmt.Println(err) 
        os.Exit(1) 
    }
    defer file.Close() 
    fmt.Fprint(file, "Astăzi ")
    fmt.Fprintln(file, "este o zi frumoasă")
}

În acest caz, ambele funcții scriu un anumit text în fișierul confeve.txt, care va fi creat în aceeași locație cu scriptul care rulează.

Formatarea și Fprintf

Funcția Fprintf simplifică scrierea datelor cu o structură mai complexă:

func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)

Primul parametru este tot un obiect io.Writer. Al doilea parametru este un șir de formatare, care indică modul în care datele vor fi formatate în timpul scrierii. Al treilea parametru este un set de valori care sunt transmise șirului de formatare și sunt scrise în fluxul de ieșire.

Șirul de formatare conține o serie de specificatori. Fiecare specificator reprezintă un set de caractere care sunt interpretate într-un anumit mod și sunt precedate de simbolul procentajului %. Fiecare specificator reprezintă un tip de date specific:

  • %t: pentru afișarea valorilor de tip boolean (true sau false)
  • %b: pentru afișarea numerelor întregi în sistemul binar
  • %c: pentru afișarea caracterelor reprezentate prin coduri numerice
  • %d: pentru afișarea numerelor întregi în sistemul zecimal
  • %o: pentru afișarea numerelor întregi în sistemul octal
  • %q: pentru afișarea caracterelor între ghilimele simple
  • %x: pentru afișarea numerelor întregi în sistemul hexazecimal, literele numerelor vor fi mici (a-f)
  • %X: pentru afișarea numerelor întregi în sistemul hexazecimal, literele numerelor vor fi mari (A-F)
  • %U: pentru afișarea caracterelor în format Unicode, de exemplu, U+1234
  • %e: pentru afișarea numerelor în virgulă mobilă în formă exponențială, de exemplu, -1.234456e+78
  • %E: pentru afișarea numerelor în virgulă mobilă în formă exponențială, de exemplu, -1.234456E+78
  • %f: pentru afișarea numerelor în virgulă mobilă, de exemplu, 123.456
  • %F: același lucru ca și %f
  • %g: pentru numerele mari cu virgulă mobilă se folosește %e, pentru celelalte se folosește %f
  • %G: pentru numerele mari cu virgulă mobilă se folosește %E, pentru celelalte se folosește %F
  • %s: pentru afișarea șirurilor
  • %p: pentru afișarea valorii unui pointer (adresă) în format hexazecimal

De asemenea, se poate folosi specificatorul universal %v, care pentru tipul boolean este echivalent cu %t, pentru tipurile întregi este echivalent cu %d, pentru numerele cu virgulă mobilă este echivalent cu %g, iar pentru șiruri este echivalent cu %s.

La specificatori pot fi adăugați diferiți indicatori care influențează formatarea valorilor. De exemplu, un număr înainte de specificator indică lungimea minimă în caractere pe care o va ocupa valoarea afișată. De exemplu, %9f - un număr cu virgulă mobilă va ocupa cel puțin 9 poziții. Dacă lățimea este mai mare decât cea necesară valorii, aceasta va fi completată cu spații.

Pentru numerele cu virgulă mobilă se poate specifica precizia sau numărul de caractere din partea fracționară. Pentru aceasta, numărul de caractere se adaugă după punct: %.2f - două caractere în partea fracționară. De exemplu, variantele de formatare a numerelor cu virgulă mobilă:

  • %f: precizie și lățime implicită
  • %9f: lățime - 9 caractere și precizie implicită
  • %.2f: lățime implicită și precizie - 2 caractere
  • %9.2f: lățime - 9 și precizie - 2
  • %9.f: lățime - 9 și precizie - 0

De asemenea, din indicatori, se remarcă semnul minus -, care completează valoarea cu spații, dar nu pe partea dreaptă, cum este implicit, ci pe partea stângă.

Aplicarea funcției Fprintf pentru a scrie într-un fișier:

package main
import (
    "fmt"
    "os"
)

type person struct { 
   name string
   age int32
   weight float64
}

func main() {
    tom := person {
        name:"Tom",
        age: 24,
        weight: 68.5,
    }
    file, err := os.Create("person.dat")
    if err != nil{
        fmt.Println(err) 
        os.Exit(1) 
    }
    defer file.Close() 
    fmt.Fprintf( file, 
               "%-10s %-10d %-10.3f\n", 
               tom.name, tom.age, tom.weight)
}

Funcția Fprintf() primește ca prim parametru și fișierul, iar ca al doilea parametru - un șir de formatare care definește modul în care vor fi formate datele. După șirul de formatare, urmează valorile care sunt plasate în locul specificatorilor. Aceste valori sunt transmise în ordinea specificatorilor: primul parametru va înlocui primul specificator, al doilea parametru va înlocui al doilea specificator și așa mai departe. În același timp, valorile trebuie să corespundă tipului specificatorului: pentru %s trebuie să se transmită un șir de caractere, pentru %d un număr întreg etc.

Astfel, în exemplul de mai sus va fi creat un fișier person.dat în același folder cu scriptul, în care vor fi scrise datele obiectului person.