# Informacijos išvedimas į failą

# Vaizdo pamoka

# Apie informacijos išvedimą į failą

  • Norint išvesti informaciją į failą, reikės susikurti išvedimo srauto operatorių, atsidaryti failą, atlikti išvedimo veiksmus ir uždaryti failą.
  • Išvedimui naudosite susikurtą srauto operatorių ir jį galėsite naudoti taip pat kaip naudojot cout.

# Sintaksė

Išvedimo į failą operatoriaus pasiruošimas:

ofstream operatorius;
  • ofstream - komanda, parodanti, kad kuriate išvedimo į failą operatorių.
  • operatorius - jūsų sugalvotas operatoriaus pavadinimas, kurį naudosite norint išvesti duomenis į failą.

Failo atsidarymas:

operatorius.open("failo_pavadinimas.txt");

Taip pat, galima susikurti norimą išvedimo operatorių ir atsidaryti failą išvedimui vienoje eilutėje:

ofstream operatorius("failo_pavadinimas.txt");
  • ofstream - komanda, parodanti, kad kuriate išvedimo į failą operatorių.
  • operatorius - jūsų sugalvotas operatoriaus pavadinimas, kurį naudosite norint išvesti duomenis į failą.
  • failo_pavadinimas.txt - failas, kurį atidarote išvedimui.

Duomenų išvedimas į failą, analogiškas cout išvedimui į konsolę:

operatorius << "tekstas";

Failo uždarymas:

operatorius.close();

# Failo papildymas

Atsidarant failą rašymui, jis būna išvalomas ir yra rašomas iš naujo. Norint tęsti išvedimą į anksčiau pradėtą failą, jį atsidarant galima panaudoti ios:app:

ofstream operatorius("failas.txt", ios::app);

# Teksto formatavimas

Tam tikriems teksto formatavimo dalykams bus naudojama ši biblioteka:

#include <iomanip>

Teksto formatavimo komandos naudojamos išvedime prie cout ar išvedimo į failą operatoriaus (kurį susikūrėte prie ofstream), prieš kiekvieną vietą, kurioje reikia tam tikro formatavimo. Pavyzdžiui, cout atveju:

// Nustatomas 20 simbolių plotis ir kairinis teksto lygiavimas
cout << setw(20) << left << "tekstas" << endl;

Ar su išvedimo į failą operatoriumi:

ofstream isvedimas("failas.txt");

// Nustatomas 20 simbolių plotis ir kairinis teksto lygiavimas
isvedimas << setw(20) << left << "tekstas" << endl;

# Simbolių kiekio nustatymas eilutėje

Sintaksė:

setw(<skaicius>)

Bus nustatymas nurodyto pločio simbolių kiekis teksto ar skaičiaus išvedimui. Jei tekstas ar skaičius bus sudarytas iš mažiau simbolių nei nurodyta - likusi vieta bus užpildoma su paprastais tarpais, kad būtų užpildytas reikiamas plotis. O jeigu tekstas ar skaičius bus sudarytas iš daugiau simoblių nei nurodyta - bus nukerpama likusi dalis, kad neviršytų nurodyto pločio.

Pavyzdys:

setw(10)

Panaudojimas:

// dalis "tekstas" užims 10 simbolių vietos, todėl tai taps "   tekstas"
cout << setw(10) << "tekstas" << "kitas";

# Teksto lygiavimas

Kairėje pusėje:

left

Dešinėje pusėje:

right

Panaudojimas:

// dalis "tekstas" užims 10 simbolių vietos ir bus sulygiuotas kairėje pusėje,
// todėl tai taps "tekstas   "
cout << setw(10) << left << "tekstas" << "kitas";

# Skaičių po kablelio nustatymas

Bandant išvesti skaičių per kablelį (float, double), galima nurodyti kiek maksimaliai skaičių bus atvaizduojama po kablelio:

setprecision(<skaicius>)

Panaudojimas:

double skaicius = 8.58455;
cout << setprecision(3) << skaicius << endl; // 8.58

skaicius = 9.54;
cout << setprecision(5) << skaicius << endl; // 9.54

# Skaičių po kablelio užfiksavimas

Jeigu norima išvesti būtinai išvesti tam tikrą kiekį skaičių po kablelio, tai galima užfiksuoti su fixed raktažodžiu, kuris likusias vietas užpildys nuliais:

fixed

Panaudojimas:

double skaicius = 8.58455;
cout << fixed << setprecision(3) << skaicius << endl; // 8.585

skaicius = 9.54;
cout << fixed << setprecision(5) << skaicius << endl; // 9.54000

# Pavyzdžiai

# Pavyzdys 1

Kodas:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main()
    {
        // sukuriamas išvedimo srauto operatorius
        ofstream rezultatai;
    
        // atsidaromas failas išvedimui
        rezultatai.open("rezultatai.txt");
    
        // išvedama informacija į failą
        rezultatai << "koks nors tekstas" << endl;
        rezultatai << "dar teksto, kitoje eiluteje" << endl;
    
        // failas uždaromas
        rezultatai.close();
    
        return 0;
    }
    
    koks nors tekstas
    dar teksto, kitoje eiluteje
    
    
    // Make sure to add code blocks to your code group

    # Pavyzdys 2

    Kodas:

      #include <iostream>
      #include <fstream>
      using namespace std;
      
      int main()
      {
          // sukuriamas srauto operatorius išvedimui ir atidaromas failas išvedimui
          ofstream isvedimas("rezultatai.txt");
      
          // kintamieji duomenims
          string vardas;
          int amzius;
      
          // informacijos suvedimas konsolės pagalba
          cout << "Iveskite savo varda: ";
          cin >> vardas;
          cout << "Iveskite amziu: ";
          cin >> amzius;
      
          // informacijos išvedimas į failą
          isvedimas << "Ivestas vardas: " << vardas << endl;
          isvedimas << "Bei amzius: " << amzius << endl;
      
          // failo uždarymas
          isvedimas.close();
      
          return 0;
      }
      
      Ivestas vardas: Ieva
      Bei amzius: 99
      
      
      // Make sure to add code blocks to your code group

      Konsolė:

      Iveskite savo varda: Ieva
      Iveskite amziu: 99
      

      # Pavyzdys 3

      Kodas:

        #include <iostream>
        #include <fstream>
        using namespace std;
        
        int main()
        {
            ofstream isvedimas("rezultatai.txt");
        
            int skaiciai[] = { 8, 5, 3, 5, 4 };
            int kiekis = 5;
        
            for (int i = 0; i < kiekis; i++)
            {
                isvedimas << skaiciai[i] << " ";
            }
        
            isvedimas.close();
        
            return 0;
        }
        
        8 5 3 5 4 
        
        // Make sure to add code blocks to your code group

        # Pavyzdys 4

        Kodas:

          #include <iostream>
          #include <fstream>
          using namespace std;
          
          int main()
          {
              ofstream isvedimas("rezultatai.txt");
          
              string vardai[] = { "Tomas", "Petras", "Gintare", "Inga" };
              int amziai[] = { 70, 60, 30, 40 };
              int kiekis = 4;
          
              for (int i = 0; i < kiekis; i++)
              {
                  isvedimas << vardai[i] << " " << amziai[i] << endl;
              }
          
              isvedimas.close();
          
              return 0;
          }
          
          Tomas 70
          Petras 60
          Gintare 30
          Inga 40
          
          
          // Make sure to add code blocks to your code group

          # Pavyzdys 5

          Kodas:

            #include <iostream>
            #include <iomanip>
            #include <fstream>
            using namespace std;
            
            int main()
            {
                ofstream isvedimas("rezultatai.txt");
            
                string vardai[] = { "Tomas", "Petras", "Gintare", "Inga" };
                int amziai[] = { 70, 60, 30, 40 };
                int kiekis = 4;
            
                isvedimas << "+---------------+--------+\n";
                isvedimas << "| Vardas        | Amzius |\n";
                isvedimas << "+---------------+--------+\n";
            
                for (int i = 0; i < kiekis; i++)
                {
                    isvedimas << "| " << setw(13) << left
                        << vardai[i] << " | " << setw(6)
                        << left << amziai[i] << " |\n";
                }
            
                isvedimas << "+---------------+--------+\n";
            
                isvedimas.close();
            
                return 0;
            }
            
            +---------------+--------+
            | Vardas        | Amzius |
            +---------------+--------+
            | Tomas         | 70     |
            | Petras        | 60     |
            | Gintare       | 30     |
            | Inga          | 40     |
            +---------------+--------+
            
            
            // Make sure to add code blocks to your code group

            # Pavyzdys 6

            Kodas:

              #include <iostream>
              #include <iomanip>
              #include <fstream>
              using namespace std;
              
              int main()
              {
                  ofstream isvedimas("rezultatai.txt");
              
                  string vardai[] = { "Tomas", "Petras", "Gintare", "Inga" };
                  double ugiai[] = { 1.85, 1.755, 1.7, 1.6 };
                  int kiekis = 4;
              
                  isvedimas << "+---------------+----------+\n";
                  isvedimas << "| Vardas        | Ugis, m. |\n";
                  isvedimas << "+---------------+----------+\n";
              
                  for (int i = 0; i < kiekis; i++)
                  {
                      isvedimas << "| " << setw(13) << left
                          << vardai[i] << " | " << setw(8)
                          << left << setprecision(2) << ugiai[i] << " |\n";
                  }
              
                  isvedimas << "+---------------+----------+\n";
              
                  isvedimas.close();
              
                  return 0;
              }
              
              +---------------+----------+
              | Vardas        | Ugis, m. |
              +---------------+----------+
              | Tomas         | 1.9      |
              | Petras        | 1.8      |
              | Gintare       | 1.7      |
              | Inga          | 1.6      |
              +---------------+----------+
              
              
              // Make sure to add code blocks to your code group

              # Pavyzdys 7

              Kodas:

                #include <iostream>
                #include <fstream>
                using namespace std;
                
                int main()
                {
                    ofstream isvedimas("rezultatai.txt");
                
                    int skaiciai[] = { 8, 5, 4, 3, 2, 1, 5, 6 };
                    int kiekis = 8;
                
                    for (int i = 0; i < kiekis; i++)
                    {
                        isvedimas << skaiciai[i] << endl;
                    }
                
                    isvedimas.close();
                
                    return 0;
                }
                
                8
                5
                4
                3
                2
                1
                5
                6
                
                
                // Make sure to add code blocks to your code group

                # Pavyzdys 8

                Kodas:

                  #include <iostream>
                  #include <fstream>
                  using namespace std;
                  
                  int main()
                  {
                      ofstream isvedimas("rezultatai.txt");
                  
                      int skaiciai[] = { 8, 5, 4, 3, 2, 1, 5, 6 };
                      int kiekis = 8;
                  
                      isvedimas << "Skaiciai: ";
                      int suma = 0;
                  
                      for (int i = 0; i < kiekis; i++)
                      {
                          isvedimas << skaiciai[i] << " ";
                          suma += skaiciai[i];
                      }
                  
                      isvedimas << endl;
                      isvedimas << "Siu skaiciu suma: " << suma;
                  
                      isvedimas.close();
                  
                      return 0;
                  }
                  
                  Skaiciai: 8 5 4 3 2 1 5 6 
                  Siu skaiciu suma: 34
                  
                  // Make sure to add code blocks to your code group

                  # Pavyzdys 9

                  Kodas:

                    #include <iostream>
                    #include <fstream>
                    using namespace std;
                    
                    int main()
                    {
                        ofstream isvedimas("rezultatai.txt", ios::app);
                    
                        isvedimas << "tekstas" << endl;
                    
                        isvedimas.close();
                    
                        return 0;
                    }
                    
                    tekstas
                    tekstas
                    tekstas
                    
                    
                    // Make sure to add code blocks to your code group

                    Pastaba

                    Kiekvieną kartą paleidus programą, failas yra pildomas toliau, o ne perrašomas.

                    # Pavyzdys 10

                    Kodas:

                      #include <iostream>
                      #include <fstream>
                      #include <ctime>
                      using namespace std;
                      
                      int main()
                      {
                          ofstream isvedimas("rezultatai.txt");
                      
                          srand(time(NULL));
                      
                          int kiek;
                          cout << "Kiek skaiciu irasyti? ";
                          cin >> kiek;
                          
                          for (int i = 0; i < kiek; i++)
                          {
                              isvedimas << rand() % 100 << " ";
                          }
                      
                          isvedimas.close();
                      
                          return 0;
                      }
                      
                      86 28 61 91 20 93 66 53 86 8 
                      
                      // Make sure to add code blocks to your code group

                      Rezultatai:

                      Kiek skaiciu irasyti? 10
                      

                      # Užduotys

                      # Užduotis 1

                      Į failą, skirtingose eilutėse, išveskite:

                      • Savo vardą.
                      • Kodėl mokotės C++.
                      • Kaip jums sekasi mokytis.

                      # Užduotis 2

                      Į failą išveskite šių skaičiavimų atsakymus:

                      • 5 + 3
                      • 8 * 2
                      • 9 / 2

                      # Užduotis 3

                      • Leiskite vartotojui konsolės pagalba suvesti dabartinius metus ir savo gimimo metus.
                      • Į failą išveskite apskaičiuotą žmogaus amžių.

                      # Užduotis 4

                      Susikurkite skaičių masyvą.

                      Raskite skaičių sumą, vidurkį, bei didžiausią skaičių.

                      Į failą išveskite šią informaciją:

                      • Pirmoje eilutėje visus skaičius, atskiriant tarpu.
                      • Antroje eilutėje rastą sumą, su prierašu "suma".
                      • Trečioje eilutėje rastą vidurkį, su prierašu "vidurkis".
                      • Ketvirtoje eilutėje rastą didžiausią skaičių, su prierašu "didžiausias skaičius".

                      # Užduotis 5

                      Susikurkite du skirtingus skaičių masyvus.

                      Iš kiekvieno masyvo raskite didžiausią skaičių.

                      Raskite kurio masyvo didžiausias skaičius yra didesnis.

                      Į failą išveskite šią informaciją:

                      • Pirmoje eilutėje pirmo masyvo skaičius.
                      • Antroje eilutėje pirmo masyvo didžiausią skaičių.
                      • Trečioje eilutėje antro masyvo skaičius.
                      • Ketvirtoje eilutėje antro masyvo didžiausią skaičių.
                      • Penktoje eilutėje atsakymą kuriame masyve rastas didžiausias skaičius yra didesnis.

                      # Užduotis 6

                      Susikurkite du masyvus informacijai apie studentus saugoti:

                      • Pirmasis masyvas - studentų vardai.
                      • Antrasis masyvas - studentų vidurkiai (skaičiai per kablelį).

                      Šią informaciją išveskite į failą lentelės pavidalu:

                      • Pirmame stulpelyje studento vardas.
                      • Antrame stulpejyje studento vidurkis. Skaičius fiksuotas, 1-as skaičius po kablelio (9.5, 8.0, ...).

                      # Užduotis 7

                      Leiskite vartotojui papildyti failą skaičiais:

                      • Vartotojas konsolės pagalba suveda norimą kiekį skaičių.
                      • Šie skaičiai išvedami į failą, nepanaikinant anksčiau įrašytų skaičių.

                      # Užduotis 8

                      Į failą išveskite pasirinkto dydžio daugybos lentelę:

                      • Vartotojas įveda norimą eilučių ir stulpelių kiekį konsolės pagalba.
                      • Programa išveda nurodyto dydžio daugybos lentelę į failą.
                      • Lentelė turi būti gražiai formatuota, t.y. skaičiai tuose pačiuose stulpeliuose ir pan., kad būtų vienas paskui kitą.