Sunday, October 8, 2017

Kuliah 10 C++: File



BAB 10.
Aliran I/O dan Bekerja dengan File






10.1 Pengantar
Hampir semua program melibatkan operasi masukan dan keluaran. Ada sejumlah divais yang bisa dibaca oleh sebuah program. Masukan bisa dibaca dari keyboard yang terhubung dengan komputer, atau dibaca dari file pada harddisc, CD ROM, file internet, dan lainnya. Sama halnya, keluaran program umumnya ditampilkan di layar yang terhubung ke komputer, atau bisa saja keluaran program diberikan ke printer untuk dicetak, atau disimpan ke file/CD ROM dan lainnya. Dari semua divais tersebut, keyboard dipandang sebagai divais masukan standar dan layar/monitor dipandang sebagai divais keluaran standar. Pada bab-bab sebelumnya, Anda telah sering menggunakan objek cin dan cout untuk melakukan operasi masukan dan keluaran. Kedua objek tersebut didefinisikan di dalam file header <iostream>. Objek cin dimaksudkan untuk melakukan operasi masukan/pembacaan dari divais masukan standar, yaitu keyboard. Objek cout dimaksudkan untuk mengirimkan/menampilkan keluaran program ke divais keluaran standar, yaitu monitor yang terhubung dengan komputer.

Dalam C++, operasi-operasi I/O (input/output, masukan/keluaran) dijalankan oleh sejumlah fungsi anggota dari kelas-kelas template yang relevan. Oleh karena itu, operasi-operasi I/O adalah operasi-operasi yang berorientasi objek dan sensitif terhadap tipe data. Operasi I/O dari suatu tipe data tertentu dilakukan oleh fungsi anggota terkait dari kelas itu. Jika kompiler tidak dapat menemukan sebuah fungsi untuk tipe data yang disajikan, maka kompiler akan memberikan sinyal error. Untuk tipe-tipe data fundamental, operator penyisipan (<<) untuk keluaran dan operator ekstraksi (>>) untuk masukan telah didefinisikan di dalam file header <ostream> dan <istream> dan diwarisi oleh kelas <iostream> yang menangani keluaran dan masukan sekaligus.

Bekerja dengan file merupakan fitur penting pada semua aplikasi komputer. Aplikasi-aplikasi saat ini berkaitan dengan (menangani) file-file berukuran besar. Sebagai contoh, komputer untuk penyedia layananan bergerak bisa saja memiliki jutaan file konsumen, yaitu rekaman panggilan untuk sedikitnya dua bulan perlu dipertahankan atau disimpan. Operasi-operasi masukan/keluaran dengan file difasilitasi oleh file header <fstream> yang diwarisi dari file-file header <ifstream>, <ofstream>, dan <iostream>.

Bagian pertama dari bab ini akan berkaitan dengan aliran masukan/keluaran untuk operasi konsol dan bagian kedua dari bab ini akan berkaitan dengan aliran masukan/keluaran untuk file.



10.2 Aliran I/O untuk Operasi Konsol
Dalam C++, operasi-operasi I/O dilakukan oleh aliran-aliran (Gambar 10.1). Aliran adalah sebuah runtun byte. Pada kasus masukan, aliran masukan mengalir dari divais eksternal ke memori utama dari komputer dan pada kasus keluaran, aliran byte mengalir dari memori utama ke divais keluaran. Pada kasus masukan standar, aliran berasal dari keyboard dan untuk keluaran standar, aliran mengalir dari memori utama ke monitor. Namun, aliran dapat diredireksi atau diubah-arah dari divais-divais selain keyboard pada kasus masukan dan dapat diubah-arah ke divais-divais lain selain monitor pada kasus keluaran. Aliran masukan dan aliran keluaran diilustrasikan pada Gambar 10.1 berikut.



GAMBAR 10.1 Aliran masukan dan aliran keluaran



GAMBAR 10.2 Kelas-kelas aliran untuk operasi masukan/keluaran dengan konsol


Gambar 10.2 menunjukkan sejumlah kelas yang berkaitan dengan operasi-operasi I/O dan hierarkinya. Kelas basic_ios yang diwarisi dari io_base mendukung operasi-operasi I/O terformat dan tak-terformat. Kelas iostream yang telah digunakan pada semua program sejauh ini merupakan sebuah typedef dari basic_iostream untuk char. Detil dari kelas-kelas ini diberikan sebagai berikut:

ios_base dan basic_ios
Kelas ios_base adalah kelas basis yang memiliki fungsi-fungsi untuk melakukan operasi masukan dan keluaran baik terformat maupun tak-terformat. Kelas basic_ios diwarisi dari ios_base. Kelas basic_istream dan basic_ostream diwarisi dari basic_ios. Typedef dari basic_ios, ios, dipakai untuk mengimplementasikan basic_ios untuk menggunakan char dan wios digunakan untuk menggunakan wchar_t.

basic_istream
Kelas basic_istream mendukung operasi-operasi masukan. Kelas ini diwarisi dari kelas basic_ios menggunakan pewarisan virtual. Kelas ini diimplementasikan oleh typedef istream untuk menggunakan char. Kelas ini juga mendefinisikan tiga fungsi: get(), getline(), dan read(), di samping fungsi-fungsi lain. Kelas ini memuat operator ekstraksi aliran (>>) untuk tipe-tipe data fundamental C++.  Tipe data wchar_t didukung oleh typedef wistream.

basic_ostream
Kelas basic_ostream mendukung semua operasi keluaran. Ia diwarisi dari basic_ios sehingga mewarisi semua fungsi dari kelas tersebut. Kelas ini mendefinisikan fungsi put() untuk menuliskan karakter tunggal dan fungsi write() untuk mengirim sejumlah byte dari memori ke divais keluaran. Untuk mengimplementasikannya untuk char, typedef ostream digunakan. Untuk wchar_t, typedef terkait adalah wostream.

basic_iostream
Kelas basic_iostream mendukung semua operasi masukan/keluaran. Kelas ini diwarisi dari basic_istream dan basic_ostream melalui pewarisan jamak. Jadi, kelas ini mewarisi fungsi-fungsi dari kelas basic_ios, basic_istream, dan basic_ostream. Untuk implementasinya, typedef iostream dipakai untuk menggunakan char. Untuk wchar_t, namanya adalah wiostream. Kelas iostream dimuat di dalam file header <iostream>. Kelas iostream mendefinisikan objek cin, cout, cerr, dan clog. Untuk wchar_t, objek-objek terkait adalah wcin, wcout, wcerr, dan wclog.

basic_streambuf
Kelas basic_ios memuat pointer untuk basic_streambuf. Kelas ini menyediakan antarmuka penyangga antara data dan memori dan divais-divais fisikal lainnya. Kelas ini memiliki typedef streambuf yang dipakai untuk mengimplementasikan char. Kelas ini mendukung metode-metode level rendah untuk menangani aliran. Kelas basic_filebuf dan basic_strstreambuf diwarisi dari basic_streambuf. Typedef untuk char adalah streambuf dan typedef untuk wchar_t adalah wstreambuf.




10.3 Aliran I/O Standar Pustaka
Empat aliran berikut didefinisikan untuk I/O standar. Operator ekstraksi (>>) dan operator penyisipan (<<) didefinisikan untuk tipe-tipe data fundamental. Untuk tipe data yang didefinisikan user, Anda perlu mengoverload atau membebani operator ekstraksi dan operator penyisipan.
cin       : untuk masukan dari divasi masukan standar (keyboard)
cout     : untuk keluaran ke divais keluaran standar (monitor)
cerr      : untuk keluaran error standar pada monitor
clog     : untuk keluaran error tersangga pada monitor

ALIRAN MASUKAN STANDAR
Kelas istream mendukung metode-metode untuk masukan/pembacaan data terformat maupun data tak-terformat. Objeknya, cin, berikut dengan operator ekstraksi (>>) dipakai untuk masukan tipe-tipe data fundamental. Untuk tipe data user, operator ekstraksi >> harus dioverload atau dibebani. Pada dasarnya, operator >> adalah operator pergeseran kanan yang dibebani untuk melakukan operasi ekstraksi.

Pada saat ekstraksi, operator ekstraksi mengirimkan referensi kembali ke cin. Hal ini dapat dipakai untuk operasi ekstraksi bertingkat dan Anda bisa mengekstraksi sejumlah nilai yang dituliskan satu di samping yang lain dan masing-masing nilai itu diawali dengan operator ekstraksi. Sebagai contoh, jika diperlukan untuk mengekstraksi nilai n, m, A, dan B, Anda bisa menuliskan statemen masukan sebagai berikut:

cin >> n >> m >> A >> B ;

Referensi yang dikirim kembali oleh operator ekstraksi dapat pula digunakan di dalam sebuah loop. Program berikut mengilustrasikan aplikasi dari cin.

Program 10.1 Mengilustrasikan aplikasi dari cin

#include<iostream>
using namespace std;

void main()
{
   int A ;
   double B ;
   char ch ;
   char Nama [10];

   cout<<"Masukkan nilai A: ";
   cin>>A;
   cout<<"Masukkan nilai B : ";
   cin>>B;

   cout<<"Masukkan nilai ch : ";
   cin>>ch ;
   cout<<"Masukkan nama: ";
   cin>>Nama;

   cout<<"Anda telah memasukkan data berikut: "<<endl;
   cout<<"A = "<<A <<", B = "<<B <<", ch = "<<ch <<", Nama = "<<Nama<<endl;
}
KELUARAN
Masukkan nilai A: 9
Masukkan nilai B : 3.5
Masukkan nilai ch : L
Masukkan nama: Kristof
Anda telah memasukkan data berikut:
A = 9, B = 3.5, ch = L, Nama = Kristof


ALIRAN KELUARAN STANDAR
Untuk aliran keluaran standar, Anda menggunakan objek cout dari kelas ostream berikut dengan operator penyisipan terbeban <<. Operator << merupakan operator pergeseran kiri yang dioverload atau dibebani untuk melakukan operasi penyisipan untuk tipe-tipe data fundamental. Untuk tipe data user, operator penyisipan >> harus dioverload atau dibebani. Pada dasarnya, operator >> adalah operator pergeseran kiri yang dibebani untuk melakukan operasi penyisipan.

Pada saat penyisipan, operator penyisipan mengirimkan referensi kembali ke cout. Hal ini dapat dipakai untuk operasi penyisipan bertingkat dan Anda bisa menyisipkan sejumlah nilai yang dituliskan satu di samping yang lain dan masing-masing nilai itu diawali dengan operator penyisipan. Sebagai contoh, jika diperlukan untuk menyisipkan (menampilkan ke monitor) nilai n, m, A, dan B, Anda bisa menuliskan statemen keluaran sebagai berikut:

cout << n << m << A << B ;

Referensi yang dikirim kembali oleh operator penyisipan dapat pula digunakan di dalam sebuah loop. Program berikut mengilustrasikan aplikasi dari cout.


Program 10.2 Mengilustrasikan aplikasi dari cout

#include<iostream>
using namespace std;

void main()
{
   int A =4;
   double B =25303.45;
   char ch = 'T';
   char Nama[] = "Mona";

   cout<<A<<endl;
   cout<<B<<endl;

   cout<<ch<<endl;
   cout<<Nama<<endl;

   cout<<Nama<<" membayar Rp. "<<B<<" untuk "<< A <<" buah apel." <<endl;
}
KELUARAN
4
25303.5
T
Mona
Mona membayar Rp. 25303.5 untuk 4 buah apel.


OBJEK cerr dan clog
Objek cerr dan clog juga objek dari kelas ostream. Objek cerr umumnya dipakai untuk menangani error. Objek cerr mengirimkan keluaran program (tanpa dikirim ke penyangga lebih dahulu) ke divais keluaran standar. Objek clog mengirimkan keluaran program (dikirim ke penyangga lebih dahulu) ke divais keluaran standar.

Program 10.3 Mengilustrasikan aplikasi dari objek cerr dan clog dari kelas ostream

#include <iostream>
#include <cmath>     //dicantumkan untuk fungsi-fungsi matematika
using namespace std;

int main()
{
   double x ;

   cout<<"Masukkan sebuah nilai double: ";
   cin>>x;

   if (x<0)
   {
      cout<<"Argumen sqrt bernilai negatif"<<endl;
      cout<<"Masukkan nilai positif.\n";
      exit(0);
   }

   cout<<sqrt(x)<<endl;

   cerr.width(20);
   cerr.fill('*');
   cerr.precision(7);

   cerr<<sqrt(6.0)<<endl;

   clog<<"Akar kuadrat dari 16 adalah: "<<sqrt(16)<<endl;

   return 0;
}
KELUARAN
Masukkan sebuah nilai double: -10
Argumen sqrt bernilai negatif
Masukkan nilai positif.

Masukkan sebuah nilai double: 15
3.87298
*************2.44949
Akar kuadrat dari 16 adalah: 4



10.4 Fungsi-Fungsi dari <istream> dan <ostream>
Berikut akan didiskusikan fungsi-fungsi yang umum digunakan dari istream dan ostream.

FUNGSI get() DAN put()
Fungsi get() merupakan sebuah fungsi anggota dari kelas istream dan fungsi put() adalah sebuah fungsi anggota dari kelas ostream. Kedua fungsi tersebut dimaksudkan untuk menangani karakter tunggal. Jadi, get() dipakai untuk membaca karakter tunggal dari sebuah masukan divais dan fungsi put() dipakai untuk menulis/mengirim sebuah karakter ke divais keluaran. Argumen-argumen untuk kedua fungsi akan didiskusikan berikut.

FUNGSI get()
Fungsi get() membaca sebuah karakter tunggal, yang mencakup karakter spasi putih dan eof. Fungsi ini harus digunakan dengan objek dari kelas istream, misalnya, cin.get(). Fungsi ini bisa digunakan dengan argumen kosong, seperti cin.get() atau dengan satu argumen seperti cin.get(char*), atau dengan dua argumen atau tiga argumen. Setiap kasus ini akan didiskusikan selanjutnya.

cin.get();
char ch;
ch = cin.get()

Pada kasus ini, fungsi get() membaca sebuah karakter dan menghasilkan nilai yang ditugaskan kepada ch. Program 10.4 mengilustrasikan aplikasinya dengan bentuk ini (tanpa argumen). Fungsi get() dengan satu argumen diilustrasikan sebagai berikut:

cin.get(char*);

Pada kasus ini, fungsi ini menugaskan karakter yang dibaca kepada argumennya. Kodenya diilustrasikan sebagai berikut:

char ch;
cin.get(ch);

Program 10.5 mengilustrasikan aplikasi dari bentuk ini. Fungsi get() dengan dua argumen diilustrasikan sebagai berikut:

cin.get(char* buffer, size_t n);

Pada bentuk ini, fungsi get() membaca karakter demi karakter sebanyak n – 1 karakter pertama ke dalam buffer. Karakter terakhir adalah karakter NULL (\0) yang menandai akhir dari string dan ditempatkan di belakang string oleh sistem. Aplikasi dari bentuk ini diilustrasikan pada program 10.6.

cin.get(char* buffer, size_t n, char delim);

Pada bentuk fungsi ini, jumlah karakter yang akan dibaca ke dalam buffer dibatasi hanya sebanyak (n – 1) karakter atau pembacaan dihentikan ketika dijumpai karakter pembatas delim atau EOF. Karakter pembatas tidak termasuk karakter yang dibaca ke dalam buffer. Program 10.6 dan program 10.7 mengilustrasikan aplikasi dari fungsi ini.

Program 10.4 Mengilustrasikan aplikasi dari cin.get()

#include<iostream>
using namespace std;

int main ()
{
   char ch ;

   cout<<"Tuliskan sebuah karakter: ";
   ch = cin.get();

   cout<<"Karakter ch: "<<ch<<endl;

   return 0;
}
KELUARAN
Tuliskan sebuah karakter: g
Karakter ch: g

Program berikut mengilustrasikan versi kedua, cin.get(ch).

Program 10.5 Mengilustrasikan aplikasi dari fungsi get() dalam bentuk cin.get(ch)

#include<iostream>
using namespace std;

int main ()
{
   char ch ;

   cout<<"Tuliskan sebuah karakter: ";
   cin.get(ch);

   cout<<"Karakter ch: "<<ch<<endl;
   cout<<"\n";

   return 0;
}
KELUARAN
Tuliskan sebuah karakter: t
Karakter ch: t

Program berikut mengilustrasikan fungsi cin.get() dengan dua argumen:

cin.get(char*buffer, size_t n);

Pada bentuk ini, fungsi membaca ke dalam buffer karakter demi karakter sampai total karakter sebanyak n – 1 atau sampai akhir file (EOF). Karakter ke-n adalah karakter Null yang ditempatkan di belakang oleh sistem.

Program 10.6 Mengilustrasikan aplikasi dari fungsi cin.get() dengan dua argumen

#include <iostream>
using namespace std;

void main()
{
   int i =0;
   char B[20];

   cout<<"Masukkan nama: ";
   cin.get(B,6);     //hanya membaca 5 karakter, yaitu 6 - 1 karakter
                     //karakter terakhir adalah '\0' ditempatkan di belakang

   cout<<"Anda menuliskan: "<<B<<endl;
}
KELUARAN
Masukkan nama: Kristofer
Anda menuliskan: Krist

Program berikut mengilustrasikan fungsi cin.get() dengan tiga argumen, dalam bentuk berikut:

cin.get(char* buffer, size_t n, char delim);

Pada bentuk fungsi ini, jumlah karakter yang akan dibaca ke dalam buffer dibatasi hanya sebanyak (n – 1) karakter atau pembacaan dihentikan ketika dijumpai karakter pembatas delim atau EOF. Karakter pembatas tidak termasuk karakter yang dibaca ke dalam buffer. Lihat program 10.7 untuk ilustrasi.

FUNGSI getline()
Fungsi yang digunakan dengan objek istream untuk membaca sebaris teks utuh adalah cin.getline(). Fungsi ini memerlukan dua atau tiga argumen seperti diilustrasikan berikut:

char Buffer[] = “Belajar C++”;
cin.getline(Buffer, size_t n);
cin.getline(Buffer, size_t n, char delimit);

Aplikasi dari fungsi ini telah didemonstrasikan pada Bab 10 dalam program 10.9, 10.10, dan 10.11. Lihat juga program berikut.

Program 10.7 Mengilustrasikan aplikasi dari fungsi cin.get() dan cin.getline()

#include<iostream>
using namespace std;

void main()
{
   char ch = 'r'; //berikutnya, 'r' dipakai sebagai karakter pembatas
   char C[30] ;

   cout<<"Masukkan nama: ";
   cin.getline(C,30);

   cout<<"Anda memasukkan nama: ";
   cout<<C;

   char B[20];
   cout<<"\nMasukkan nama: ";
   cin.get(B,20, ch);      //membaca sampai r (r tidak termasuk dibaca)

   cout <<"Anda menuliskan: "<<B<<endl;
}
KELUARAN
Masukkan nama: John Kristof
Anda memasukkan nama: John Kristof
Masukkan nama: Sianipar
Anda menuliskan: Sianipa

Keluaran menunjukkan bahwa pada kasus cin.get(), pembacaan berhenti ketika dijumpai karakter ‘r’.



FUNGSI ignore()
Fungsi ini dipakai dengan aliran masukan. Fungsi ini dikode sebagai berikut:

cin.ignore(ukuranstream n, int pembatas)

Fungsi ini membaca dan membuang sampai dengan n karakter atau sampai ditemui karakter pembatas atau EOF (tergantung mana yang terjadi lebih dahulu). Nilai default dari n adalah 1. Aplikasi dari fungsi ini diilustrasikan pada program 10.3 pada Bab 10.

FUNGSI peek()
Fungsi ini digunakan dengan aliran masukan. Fungsi ini memerhatikan karakter tertentu, tetapi ia tidak melakukan aksi apapun. Fungsi ini dikode sebagai berikut:

cin.peek(‘D’);

Aplikasi dari fungsi ini diilustrasikan pada Bab 10 dalam program 10.3.



FUNGSI putback()
Fungsi ini adalah fungsi anggota dari kelas istream. Fungsi ini mengembalikan karakter yang dibaca sebelumnya ke aliran masukan. Kode dari fungsi ini diilustrasikan berikut:

char ch = ‘M’;
cin.peek(‘S’);
cin.putback (ch);

Sesuai dengan kode tersebut, ketika karakter ‘S’ dibaca, maka karakter itu akan diganti dengan M. Aplikasi dari fungsi ini diilustrasikan pada program 10.12 dan program 10.13 pada Bab 10.

FUNGSI put()
Fungsi ini dipakai dengan sebuah objek dari kelas ostream seperti cout.put(ch). Fungsi ini menempatkan argumen ch, sebuah karakter tunggal, ke aliran keluaran. Program berikut mengilustrasikan aplikasinya.

Program 10.8 Mengilustrasikan aplikasi dari fungsi put()

#include <iostream>
using namespace std;

int main()
{
   cout.put('M').put('E').put('D').put('A').put('N').put('\n');

   char* Nama = "Jakarta";

   cout<<Nama<<endl; //keluarannya adalah Jakarta
   cout.put(*Nama);        //keluarannya adalah satu karakter J
   cout<<"\n";

   char string[] = "Medan";

   for (int i = 0; i<5; i++)
      cout.put(string [i]);
   cout.put('\n');

   cout.put(70)<<endl;     //keluarannya adalah karakter F

   return 0;
}
KELUARAN
MEDAN
Jakarta
J
Medan
F

Fungsi put() menuliskan (mengirim ke aliran keluaran) sebuah karakter tunggal. Pada statemen keluaran pertama, fungsi ini dipakai secara berulang untuk menuliskan MEDAN. Pada statemen keluaran kedua, objek cout dengan operator penyisipan << dipakai untuk menuliskan sebuah string “Jakarta”. Ketika dilakukan oleh cout.put(), keluarannya hanya karakter ‘J’ dari Jakarta. Keluaran Jakarta diberikan dengan menuliskan (mengirim ke aliran keluaran) karakter demi karakter melalui sebuah loop for dan fungsi cout.put(). Baris cout.put(7); menghasilkan keluaran ‘F’ karena sesuai dengan himpunan ACII, nilai ekivalen dari F adalah 70 dan fungsi put() menuliskannya sebagai sebuah karakter.


FUNGSI read() dan write()
Fungsi read() merupakan suatu fungsi anggota dari kelas istream dan dipakai dengan aliran masukan seperti pada cin.read(). Fungsi write() merupakan suatu fungsi anggota dari kelas ostream dan dipakai dengan aliran keluaran seperti pada cout.write(). Fungsi write() menempatkan (ke aliran keluaran) sejumlah byte dari array karakter di dalam memori tanpa adanya pemformatan. Sama halnya, fungsi read() menempatkan ke memori sejumlah byte tanpa adanya pemformatan. Kedua fungsi read() dan write() mengambil dua argumen yang diilustrasikan berikut:

char Nama[15];
cin.read(Nama ,15);
cout.write (Nama, 15)

Program berikut mengilustrasikan aplikasi dari dua fungsi ini.

Program 10.9 Mengilustrasikan aplikasi dari fungsi write() dan read()

#include <iostream>
using namespace std;

int main()
{
   char kalimat [] = "Pergi ke sekolah";
  
   cout.write(kalimat , 13).put('\n');   //put('\n') dipakai untuk
                                                                     //menggantikan endl

   char ch[] = "A";

   cout<<"ch = ";
   cout.write(ch,1)<<endl; //diminta untuk menuliskan satu byte dari ch.

   char CH[] = "ABCDEFGHIJC" ;
   cout.write(CH, 5)<<endl; //diminta untuk menuliskan 5 byte/karakter

   char Nama[9];
   cout<<"Tuliskan nama: ";
   cin.read(Nama ,9);      //diminta untuk membaca 9 byte/karakter

   cout.write(Nama, 9)<<endl;     //diminta untuk membaca 9 byte dari Nama

   return 0;
}
KELUARAN
Pergi ke seko
ch = A
ABCDE
Tuliskan nama: John Kristof
John Kris



10.5 Operasi-Operasi I/O Terformat dengan Manipulator
Operasi-operasi I/O terformat diperlukan pada sejumlah aplikasi, seperti penyejajaran dijit dalam manipulasi aritmatika dan lain-lain. Dalam C++, ada sejumlah manipulator pustaka dan beberapa fungsi anggota kelas yang bisa dipakai untuk mengendalikan format. Fungsi-fungsi yang dituliskan sendiri oleh user juga dapat dipakai untuk pemformatan. Jadi, I/O terformat dapat dilakukan dengan tiga metode:
a.        Dengan manipulator-manipulator standar.
b.       Dengan fungsi-fungsi anggota dari kelas ios.
c.        Dengan fungsi-fungsi yang didefinisikan oleh user.

MANIPULATOR STANDAR
Manipulator berperan seperti operator yang didefinisikan di dalam file header <iostream> dan <iomanip>. Sejumlah manipulator adalah manipulator tak-terparameterisasi dan beberapa manipulator lain merupakan manipulator terparameterisasi. Tabel 10.1 menampilkan manipulator-manipulator tak-terparameterisasi, seperti dec, endl, ends, flush, hex, oct, dan ws. Semua manipulator itu didefinisikan di dalam file header <iostream>. Manipulator-manipulator terparameterisasi yang disajikan pada Tabel 10.2 didefinisikan di dalam file header <iomanip>.

TABEL 10.1 Sejumlah manipulator tak-terparameterisasi
Manipulator
Aliran
Penjelasan
dec
masukan/keluaran
Basis konversi desimal (basis 10).
endl
keluaran
Menyisipkan karakter garis-baru pada keluaran dan membuang isi dari aliran keluaran.
ends
keluaran
Menyisipkan karakter null (‘\0’) di akhir string.
flush
keluaran
Membuang isi dari aliran keluaran.
hex
masukan/keluaran
Basis konversi heksadesimal (basis 16).
oct
masukan/keluaran
Basis konversi oktal (basis 8).
ws
masukan
Melompati karakter-karakter spasi putih dari aliran masukan.

Beberapa dari manipulator-manipulator di atas diilustrasikan pada program berikut.

Program 10.10 Mengilustrasikan aplikasi dari manipulator hex, oct, dan dec

#include <iostream>
using namespace std;

int main ()
{
   int n= 183;

   cout<<"n dalam basis heksadesimal adalah = "<<hex<<n<<endl;
   cout<<"n dalam basis oktal adalah = "<<oct<<n <<endl;
   cout<<"n dalam basis desimal adalah = "<<dec<<n <<endl;

   return 0;
}
KELUARAN
n dalam basis heksadesimal adalah = b7
n dalam basis oktal adalah = 267
n dalam basis desimal adalah = 183

TABEL 10.2 Sejumlah manipulator terparameterisasi, file header <iomanip>
Manipulator
Aliran
Penjelasan
setbase(int n)
I/O
Menetapkan basis konversi menjadi n.
setfill(int C)
keluaran
Menetapkan karakter pengisi menjadi C.
setiosflags (long F)
keluaran
Mengaktifkan bendera-bendera pemformatan yang ditetapkan oleh F.
resetiosflags(long R)
keluaran
Menon-aktifkan bendera-bendera pemformatan yang ditetapkan oleh R.
setprecision (int P)
keluaran
Menetapkan kepresisian untuk nilai titik mengambang menjadi P.
setw(int w)
keluaran
Menetapkan lebar bidang menjadi w.


Program berikut mengilustrasikan beberapa manipulator yang dicantumkan pada Tabel 10.2.

Program 10.11 Mengilustrasikan aplikasi dari sejumlah manipulator terparameterisasi

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

int main()
{
   double akar;

   cout<<setw(6)<<"Nilai"<<setw(20)<<"akar(Saintifik)"<<setw(15)
       <<"akar(normal)\n"<<endl;

   for (int i =0; i<6;i++)
   {
      akar = sqrt(i);

      cout.setf(ios::left);
      cout<<setprecision (8);

      cout<<setw(10)<<i<<setw(20)<<setiosflags(ios::scientific)<<akar
          <<setw(20);
      //menetapkan lebar menjadi 10 untuk i dan lebar 20 untuk akar,
      //mengaktifkan bendera ios::scientific

      cout<<setprecision(4)<<resetiosflags(ios::scientific)<<akar<< endl;}
      //menetapkan kepresisian menjadi 4, menonaktifkan bendera ios::scientific

   return 0 ;
}
KELUARAN
Nilai     akar(Saintifik)     akar(normal)
0         0.00000000e+000     0
1         1.00000000e+000     1
2         1.41421356e+000     1.414
3         1.73205081e+000     1.732
4         2.00000000e+000     2
5         2.23606798e+000     2.236

Di samping manipulator-manipulator yang telah disebutkan, kelas ios juga memiliki beberapa fungsi anggota yang bisa dipakai untuk pemformatan. Beberapa di antaranya dicantumkan pada Tabel 10.3.



TABEL 10.3 Sejumlah fungsi anggota dari kelas ios untuk pemformatan
Manipulator
Penjelasan
fill()
Menetapkan karakter pengisi untuk lebar bidang yang tak terpakai.
precision()
Menetapkan jumlah dijit dari nilai-nilai titik-mengambang.
setf()
Mengaktifkan bendera tertentu untuk memformat keluaran.
unsetf()
Menonaktifkan bendera tertentu.
width()
Menetapkan lebar bidang.



10.6 Pemformatan dengan Menetapkan Bendera dan Bidang Bit
Sejumlah operasi pemformatan dilakukan dengan menetapkan bendera-bendera pemformatan melalui fungsi setf(). Sebagai contoh, ketika lebar ditetapkan, jumlah karakter bisa kurang dari lebar yang ditetapkan. Secara default, spasi-spasi akan ditempatkan di sisi kiri. Unttuk menempatkan spasi-spasi kosong di kanan, Anda perlu menetapkan bendera-bendera pemformatan dengan fungsi setf() yang memiliki dua bentuk berikut:

setf(argumen1, argumen2);
setf(argumen1);

Dapat dilihat bahwa argumen1 untuk menetapkan bendera pemformatan dan argumen2 untuk bidang bit. Pada kasus penggunaan setf() hanya dengan satu argumen, argumen1 yang digunakan. Kode-kode untuk menetapkan bendera yang lain dicantumkan pada Tabel 10.4. Untuk menonaktifkan bendera, fungsi unsetf() dipakai, yang hanya memerlukan satu argumen. Penetapan dan pembatalan (penonaktifan) diilustrasikan berikut.

Instruksi-instruksi penetapan bendera berkaitan dengan bidang-bidang bit yang berbeda. Oleh karena itu, ketika mengunakan dua argumen, kehati-hatian diperlukan agar argumen pertama terkait dengan bidang bit yang ditetapkan oleh argumen kedua. Ini diilustrasikan berikut. Untuk menampilkan notasi saintifik, Anda perlu menuliskan salah satu dari dua kode berikut:

cout.setf(ios::scientific, ios::floatfield);
cout.setf(ios::scientific);

Tetapi, untuk menonaktifkan bendera, fungsi unsetf() hanya memerlukan satu argumen, yaitu argumen pertama. Sebagai contoh, kode untuk membatalkan pengaturan di atas adalah:

cout.unsetf(ios::scientific);

TABEL 10.4 Argumen-argumen dari setf(argumen1, argumen2) dan hasilnya
Nilai bendera argumen1
Lebar bidang
argumen2
Penjelasan
ios::dec
ios::basefield
Konversi ke basis desimal (10).
ios::hex
ios::basefield
Konversi ke basis heksadesimal (16).
ios::oct
ios::basefield
Konversi ke basis oktal (8).
ios::fixed
ios::floatfield
Notasi mengambang normal.
ios::scientific
ios::floatfield
Notasi saintifik.
ios::left
ios::adjustfield
Keluaran disejajarkan ke kiri.
ios::right
ios::adjustfield
Keluaran disejajarkan ke kanan.
ios::internal
ios::adjustfield
Untuk pengganjalan internal antara tanda atau indikator basis dan nilai (angka) ketika nilai tidak memenuhi lebar yang disediakan.

Program 10.12 Mengilustrasikan aplikasi dari fungsi fill(), width(), precision(), scientific, setf(ios::left), setf(ios::right), dan unsetf()

#include<iostream>
using namespace std;

int main()
{
   cout.width(20);
   cout.fill('-');

   cout<<"Selamat pagi!\n";
   /*Selamat pagi! akan dituliskan  dalam 20 spasi
     spasi kosong akan diisi dengan dash(-) */
  
   cout.width(40);
   cout.fill('*');
   //keluaran akan dituliskan dalam 40 spasi,
   //spasi kosong akan diisi dengan bintang *.

   cout<<"Selamat belajar pemrograman C++!\n";
   int n = 4500600;
   cout.width(25);
   cout.setf(ios::left);   //penyejajaran kiri
   cout<<n<<endl;

   cout.width(25);
   cout.setf(ios::right);  //penyejajaran kanan
   cout<<n<<endl;

   double m = 344.567585435656;
   cout. width(5);
   cout.precision(10);                   //kepresisian ditetapkan 10 dijit
   cout.setf(ios::scientific);    //notasi saintifik notation
   //ini bisa juga dikode dengan
   // cout.setf(ios::scientific, ios::floatfield);
   cout<< m<<endl;

   cout.unsetf(ios::scientific);  //membatalkan notasi saintifik
   //notasi unsetf() hanya memerlukan satu parameter
   cout<<m <<endl;

   return 0;
}
KELUARAN
------Selamat pagi!
*******Selamat belajar pemrograman C++!
4500600******************
******************4500600
3.4456758544e+002
344.5675854

Notasi saintifik dan notasi normal diilustrasikan oleh dua baris terakhir dari keluaran program. Fungsi width() menetapkan lebar bidang. Penyejajaran default adalah penyejajaran kanan. Jadi, jika tidak ada pengaturan apapun tentang penyejajaran, spasi-spasi kosong, jika ada, akan berada di sisi kiri. Penyejajaran dapat diubah ke kiri dengan kode berikut sehingga spasi-spasi kosong ada di kanan:

cout.setf(ios::left);

MEMFORMAT BENDERA TANPA LEBAR BIT
Bendera pemformatan untuk fungsi setf(), yang tidak memerlukan lebar bit, dicantumkan pada Tabel 10.5, berikut dengan penjelasan singkatnya masing-masing.


TABEL 10.5 Argumen-argumen dari setf() yang tidak berkaitan dengan lebar bit
Bendera
Penjelasan
ios::showbase
Menampilkan indikator basis pada keluaran.
ios::showpoint
Menampilkan titik desimal dan nol-nol ekor.
ios::showpos
Menampilkan tanda + di depan integer.
ios::skipws
Melompati karakter-karakter spasi putih.
ios::unitbuf
Menggunakan ukuran buffer unit.
ios::uppercase
Menggunakan huruf besar untuk indikator e dan x pada notasi saintifik dan heksadesimal.

Program berikut mengilustrasikan beberapa dari pengaturan bendera ini.

Program 10.13 Mengilustrasikan aplikasi dari ios::uppercase dan ios::showbase

#include<iostream>
using namespace std;

void main()
{
   int A = 206;

   cout.setf(ios::showbase);
   cout.setf(ios::uppercase);

   cout<<"Nilai A disajikan dengan pelbagai basis:"<<endl;
   cout<<"A dalam heksadesimal = "<<hex<<A<<endl;

   cout<<"A dalam oktal = "<<oct<<A<<endl;
   cout<<"A dalam desimal = "<<dec<<A<<endl;
}
KELUARAN
Nilai A disajikan dengan pelbagai basis:
A dalam heksadesimal = 0XCE
A dalam oktal = 0316
A dalam desimal = 206



MENAMPILKAN NOL-NOL EKOR
Pada keluaran normal, nol-nol ekor diabaikan. Namun, dengan mencantumkan kode berikut, nol-nol ekor juga dicakup dalam kepresisian yang ditetapkan.

cout.setf(ios::showpoint);

Ini diilustrasikan dalam program berikut.

Program 10.14 Mengilustrasikan aplikasi dari ios::showpoint untuk menampilkan nol-nol ekor

#include<iostream>
using namespace std;

void main()
{
   double A = 60.35, B = 50.0, C = 36.80, D = 79.450;

   cout.setf(ios::showpoint);

   cout<<"A = "<<A<<endl;
   cout<<"B = "<<B<<endl;

   cout<<"C = "<<C<<endl;
   cout<<"D = "<<D<<endl;
}
KELUARAN
A = 60.3500
B = 50.0000
C = 36.8000
D = 79.4500



10.7 Introduksi File
Operasi-operasi file diberikan berikut:
a.        Menugaskan nama pada file: Setiap file harus memiliki nama atau pengenal yang berbeda di dalam direktori yang sama.
b.       Membuka file: Hal ini melibatkan pembukaan file baru, jika file tersebut belum ada, atau pembukaan file yang telah ada.
c.        Memproses file: Sebuah file dibuka dengan pelbagai tujuan yang berbeda, misalnya, untuk membaca data, menuliskan data, membaca dan menuliskan data, menempatkan data di akhir data di dalam file, menghapus data tertentu, atau memodifikasi data tertentu. Tujuan dari pembukaan sebuah file disebut dengan mode of file atau file open mode.
d.       Menutup file: Setelah pemrosesan, file ditutup. Penutupan dilakukan dengan pemanggilan fungsi anggota close() dari kelas-kelas aliran file yang akan dijelaskan nanti. Fungsi ini tidak memerlukan argumen apapun.



10.8 Kelas-Kelas Aliran File
Dalam C++, ada tiga kelas aliran template yang didefinisikan untuk menjalankan sejumlah operasi yang berkaitan dengan file, yaitu:
a.        basic_ifstream
b.       basic_ofstream
c.        basic_fstream

Typedef untuk spesialisasi char dari ketiga kelas ini adalah ifstream, ofstream, dan fstream. Kelas-kelas ini diderivasi dari istream, ostream, dan iostream, seperti diilustrasikan pada Gambar 10.3. Manipulasi file dilakukan melalui aliran masukan dan aliran keluaran. Aliran-aliran ini diatur oleh ketiga kelas, yaitu ifstream, ofstream, dan fstream, yang dimuat di dalam file header <fstream>. Oleh karena itu, setiap program yang berkaitan dengan file harus mencantumkan file header <fstream>. Adalah lebih baik untuk juga mencantumkan header <iostream> jika operasi-operasi I/O juga diperlukan pada file.

GAMBAR 10.3 Hierarki kelas-kelas aliran


Untuk operasi masukan dan keluaran standar, Anda menggunakan objek cin dan cout berikut dengan operator ekstraksi dan operator penyisipan. Namun, untuk operasi masukan/keluaran file, tidak ada aliran standar pustaka yang disediakan. Aliran masukan/keluaran didefinisikan sendiri oleh programer dengan menciptakan objek-objek dari kelas-kelas <ifstream> untuk aliran masukan dan objek-objek dari kelas-kelas <ofstream> untuk aliran keluaran.

ifstream: Kelas ini mendukung operasi-operasi masukan dari sebuah file ke suatu program. Seperti ditunjukkan pada Gambar 10.3, kelas ifstream diderivasi melalui pewarisan jamak dari kelas istream dan kelas basic_fstream, yang memiliki satu konstruktor dengan argumen void dan satu konstruktor lain dengan dua argumen, nama_file dan open_mode. Di samping itu, tiga fungsi yang didefinisikan di dalam kelas ini adalah:
a.  bool is_open();
b.  void open(nama_file, mode);
c.  void close();

Fungsi pertama dipakai untuk menguji apakah file terbuka atau tidak. Fungsi kedua dapat membuka sebuah file yang telah ada tetapi tidak membuka sebuah file baru secara default. Fungsi ketiga dipakai untuk menutup file. Fungsi ini tidak memiliki argumen. Beberapa mode dijelaskan pada Tabel 10.6.

ofstream: Kelas ini mendukung operasi-operasi keluaran dari program ke file. Kelas ini diderivasi melalui pewarisan jamak dari kelas ostream dan fstream. Pada kelas ini, ada dua konstruktor: satu konstruktor dengan argumen void dan konstruktor lain dengan dua argumen (nama_file dan mode). Mode default adalah out. Sejumlah mode dijelaskan pada Tabel 10.6. Objek dari kelas ini membuka sebuah file yang telah ada atau membuka file baru secara default jika nama file ditugaskan kepadanya. Kelas ini juga mendefinisikan tiga fungsi sebagai berikut:

bool is_open();
void open(nama_file, mode);
void close();

fstream: Kelas ini mendukung operasi-operasi masukan dan keluaran yang berkaitan dengan file. Kelas ini diderivasi dari kelas iostream. Setiap program yang menangani operasi-operasi I/O yang berkaitan dengan file dan yang berkaitan dengan divais standar perlu mencantumkan file header <fstream> dan <iostream>. File header <fstream> juga mendefinisikan tiga fungsi yang ada pada ifstream dan ofstream.



10.9 Aliran-Aliran Masukan/Keluaran File
Seperti yang disebutkan di atas, pemrosesan file dilakukan dengan bantuan konstruktor-konstruktor dan fungsi-fungsi kelas dari ketiga kelas ifstream, ofstream, dan fstream. Kelas ifstream dipakai untuk operasi-operasi masukan/pembacaan, yaitu membaca data dari file ke dalam program, sedangkan kelas ofstream dipakai untuk operasi-operasi keluaran/penyimpanan, yaitu menyimpan data dari file ke program. Kelas fstream dipakai untuk operasi-operasi masukan dan keluaran. Sebuah file dapat dibuka dengan dua metode berikut:
a.        Menggunakan fungsi konstruktor dari kelas terkait.
b.       Menggunakan fungsi anggota open() melalui sebuah objek dari kelas terkait.
Fungsi konstruktor menciptakan objek kelas. Objek dari kelas ifstream dan ofstream dapat dikonstruksi/diciptakan dengan nama aliran. Aliran terhubung ke file jika nama file ditugaskan ke objek tersebut. Kode berikut mengilustrasikan deklarasi dari aliran masukan.


DEKLARASI ALIRAN MASUKAN

Pada deklarasi tersebut, infile merupakan nama dari objek kelas ifstream sama seperti cin yang merupakan objek dari kelas istream. Objek itu diinisialisasi dengan nama “fileKu” dan ini melekatkan aliran dengan file fileKu. Nama file adalah sebuah string karakter, yang diapit dengan kutip ganda. Kelas ifstream dipakai untuk pembacaan file atau pengekstraksian data dari file oleh program. Sama halnya, kode berikut mengilustrasikan deklarasi dari aliran keluaran.


DEKLARASI ALIRAN KELUARAN

Di sini outfile adalah objek dari kelas ostream dan karena inisialisasi dengan “fileKu”, aliran keluaran melekat dengan file fileKu. Gambar 10.4 mengilustrasikan aliran masukan aliran keluaran untuk file.


GAMBAR 10.4 Aliran masukan dan aliran keluaran untuk file


Jika file tidak ada, objek dari kelas ifstream, secara default, tidak membuka file baru dengan nama yang diberikan. Namun, jika file tidak ada, objek ofstream, secara default, akan membuka file baru dengan nama yang diberikan. Ini diilustrasikan oleh dua program berikut. Pada program berikut, objek ofstream dengan nama out_ke_file dideklarasikan dan diinisialisasi dengan nama file “fileKu”. Nama aliran out_ke_file jelas mengindikasikan bahwa data mengalir dari program ke file. File tidak ada (tidak disediakan), jadi ia akan membuka file baru dengan nama “fileKu”. Namun, jika file telah ada, ia akan membuka file tersebut tetapi data yang ada di dalam file akan dihapus. Pada program berikut, Anda membuka sebuah file dan menuliskan dua kalimat ke dalamnya.

Program 10.15 Mengilustrasikan pembukaan file baru untuk penulisan data ke dalam file

#include <fstream>
#include <iostream>
using namespace std;

int main ()
{
   ofstream out_ke_file("fileKu"); //deklarasi dari aliran keluaran

   out_ke_file<<"Ayo belajar C++.\n";    //menuliskan kelimat pertama ke dalam file

   out_ke_file<<"Anda memerlukan kompiler untuk berlatih.\n";
   //menuliskan kelimat lain ke dalam file

   out_ke_file.close(); //menutup file

   return 0;
}
KELUARAN
A = 60.3500
B = 50.0000
C = 36.8000
D = 79.4500


Pada program berikut, Anda membuka sebuah file untuk membaca isinya. File telah diciptakan pada program 10.15. Sebuah aliran masukan dengan nama in_dari_file dideklarasikan dan diinisialisasi dengan nama fileKu, yang sama pada program 10.15. Isi file itu akan diekstraksi dengan bantuan fungsi getline(). Anda telah cukup familiar dengan fungsi ini dan telah menggunakannya pada aliran masukan standar seperti pada cin.getline(). Di sini, Anda menggunakannya dengan sebuah aliran masukan yang didefinisikan oleh user, yang diilustrasikan sebagai berikut:


Program 10.16 Mengilustrasikan pembukaan file yang telah ada untuk membaca data dari file ke program

#include <fstream>
#include <iostream>
using namespace std;

int main ()
{
   char str[80];

   ifstream in_dari_file ("fileKu");
  
   in_dari_file.getline(str,80);
   cout<<str<<endl;

   in_dari_file.getline(str,80);
   cout<<str<<endl;

   in_dari_file.close();

   return 0;
}
KELUARAN
Ayo belajar C++.
Anda memerlukan kompiler untuk berlatih.

Pada program di atas, Anda menggunakan fungsi getline() dua kali karena Anda mempunyai dua baris untuk dibaca. Anda bisa saja menggunakan sebuah loop. Setelah membaca satu baris, program menampilkannya di layar menggunakan statemen keluaran berikut:

cout<<str<<endl;

Selain itu, perhatikan bahwa Anda juga mendeklarasikan array karakter str sebagai char str[80]; sebelum menggunakannya. Dengan deklarasi ini, kompiler mengalokasikan 80 byte memori untuk array tersebut. Fungsi getline() membaca baris data yang kemudian disalin untuk ditampilkan menggunakan statemen keluaran standar. Jika terdapat banyak baris yang akan dibaca, Anda sebaiknya menggunakan loop while, karena umumnya Anda tidak mengetahui berapa banyak baris yang akan dibaca. Hal ini diilustrasikan pada program berikut.

Program 10.17 Mengilustrasikan pembacaan sejumlah baris data dari file

#include <fstream>
#include <iostream>
using namespace std;

int main ()
{
   char str[80];

   ifstream in_dari_file ("fileKu");

   while(in_dari_file) //loop while
   {
      in_dari_file.getline(str,80);
      cout<<str <<endl;
   }

   in_dari_file.close();

   return 0;
}
KELUARAN
Ayo belajar C++.
Anda memerlukan kompiler untuk berlatih.


Pada program 10.15, Anda telah mengamati bahwa jika file tidak ada, maka aliran keluaran akan membuka sebuah file baru. Tetapi hal yang sama tidak berlaku untuk aliran keluaran. Jadi, Anda tidak bisa membaca dari file yang tidak ada. Perhatikan program berikut untuk ilustrasi.

Program 10.18 Mengilustrasikan bahwa jika file tidak ada maka objek dari kelas ifstream tidak membuka file baru

#include <fstream>
#include <iostream>
using namespace std;

int main ()
{
   ifstream infile ("fileMu");

   if(!infile)
      cout<<"File dengan nama fileMu tidak ada."<<endl;

   return 0;
}
KELUARAN
File dengan nama fileMu tidak ada.


Pembacaan/penyimpanan file bisa dilakukan pada program yang sama. Di samping itu, file bisa saja dibuka beberapa kali. Namun, untuk menuliskan data ke dalam file, Anda perlu hati-hati karena dengan pembukaan file dengan mode default, hal itu akan menghapus konten yang ada di dalam file. Jika isi file ingin dipertahankan, maka mode pembukaan file yang tepat perlu ditetapkan (lihat Tabel 10.6).

Program 10.19 Mengilustrasikan pembacaan dan penulisan file pada program yang sama

#include<iostream>
#include<fstream>
using namespace std;

int main()
{
   char Nama[40];
   char NoMhs[11];
   int Usia;

   ofstream ke_file;
   ke_file.open("Mahasiswa"); // ke_file adalah nama dari objek stream,
   //yang membuka file dengan nama "Mahasiswa"

   cout<<"Masukkan nama mahasiswa: ";
   cin.getline(Nama, 40);
   ke_file<<Nama<<"\n";           //merekam nama mahasiswa di dalam file

   cout<<"Masukkan nomor mahasiswa: ";
   cin.getline (NoMhs, 10);
   ke_file<<NoMhs<<"\n";   //menerakam nomor mahasiswa

   cout<<"Masukkan usia mahasiswa: ";
   cin>>Usia;
   ke_file<<Usia<<"\n";           //merekam usia mahasiswa

   ke_file.close();

   ifstream From_file ("Mahasiswa");     //aliran masukan dari file
   From_file>>Nama ;       //mengekstraksi nama dari file
  
   cout<<"Yang di baca dari file: "<<endl;
   cout<<"Nama = "<<Nama<<endl;

   From_file >>NoMhs;             //mengekstraksi nomor mahasiswa
   cout<<"No. Mhsw = "<<NoMhs<<endl;

   cout<<"Usia = "<<Usia<<endl; //mengekstraksi usia mahasiswa

   From_file.close();

   return 0 ;
}
KELUARAN
Masukkan nama mahasiswa: Kristof
Masukkan nomor mahasiswa: 2015034
Masukkan usia mahasiswa: 22
Yang di baca dari file:
Nama     = Kristof
No. Mhsw = 2015034
Usia     = 22



10.10 Fungsi is_open(), get(), dan put() untuk file
Pada suatu program besar, kadangkala tidak diketahui apakah sebuah file masih terbuka atau apakah file tersebut sebelumnya terbuka namun sekarang tertutup. Karena pembukaan dan penutupan file cukup rentan terjadinya error, jadi akan lebih baik untuk memeriksa apakah file masih terbuka atau tidak. Fungsi is_open() disediakan di dalam ketiga kelas ifstream, ofstream, dan fstream untuk tujuan ini. Nilai balik dari fungsi ini adalah true (1) jika file masih terbuka dan false (0) jika file telah tertutup. Aplikasi untuk pembukaan dan penutupan file diilustrasikan pada program berikut.

Anda telah menggunakan fungsi get() dengan objek istream cin. Fungsi ini membaca satu karakter per waktu. Fungsi ini dapat pula digunakan dengan objek-objek ifstream. Sama halnya, fungsi put() yang menuliskan satu karakter per waktu dapat pula dipakai dengan objek-objek dari kelas ofstream.

Kedua fungsi, get() dan put(), berkaitan dengan satu karakter per waktu. Karakteristik ini dapat pula digunakan untuk menghitung jumlah karakter yang dibaca atau dituliskan. Aplikasinya diilustrasikan pada program berikut.

Program 10.20 Mengilustrasikan aplikasi dari fungsi get(), put(), dan is_open()

#include <fstream>
#include <iostream>
using namespace std;

int main ()
{
   ofstream outfile("fileKu");

   outfile<<"Saya yakin Anda bisa mempelajari bahasa C++.\n" ;
   outfile<<"Anda memerlukan kompiler untuk berlatih.\n";

   outfile.put('M'); //menuliskan karakter M
   outfile.put('E').put('D').put('A').put('N').put('\n');

   outfile.close();

   if (outfile.is_open())  //menggunakan is_open
      cout<<"File terbuka."<<endl;
   else
      cout<<"File terturup."<<endl;

   char kh;
   ifstream infile ("fileKu");

   while (infile)
   {
      infile.get(kh);      //membaca file karakter demi karakter
      cout << kh ;         //menampilkannya pada monitor
   }

   infile.close();

   if(!(outfile.is_open()))
      cout<<"File tertutup"<<endl;

   return 0 ;
}
KELUARAN
File terturup.
Saya yakin Anda bisa mempelajari bahasa C++.
Anda memerlukan kompiler untuk berlatih.
MEDAN

File tertutup



10.11 Fungsi open() dan Mode-Mode Pembukaan File
Fungsi anggota open() dan close() disediakan disediakan di dalam setiap dari ketiga kelas basic_ifstream, basic_ofstream, dan basic_fstream untuk pembukaan dan penutupan file. Keduanya bertipe void. Fungsi close() tidak memiliki argumen apapun. Anda telah menggunakan fungsi ini pada contoh-contoh terdahulu.

Fungsi open() memiliki dua argumen, yaitu argumen pertama adalah nama file dan argumen kedua adalah mode. Sebagai contoh, jika file akan dibukan hanya untuk pembacaan, maka modenya adalah ios::in, jika file akan dibukan hanya untuk penulisan, maka modenya adalah ios::out, jika diinginkan untuk menempatkan sesuatu di akhir file, maka modenya adalah ios::app. Sejumlah mode berbera dicantumkan pada Tabel 10.6. Fungsi open() dikode seperti diilustrasikan sebagai berikut:

objek_ifstream.open (“Nama_file”, mode)

Dimisalkan bahwa infile adalah sebuah objek dari kelas ifstream, maka fungsi open() dapat dipanggil untuk mode append (penempatan sesuatu di akhir file) sebagai berikut:

infile.open(“fileKu”, ios::app);

TABEL 10.6 Mode-mode pembukaan file
Kode mode
Penjelasan
ios::app
Mode untuk menempatkan sesuatu di akhir file.
ios::ate
Mode pembukaan di akhir file.
ios::binary
Mode pembukaan file biner.
ios::in
Mode pembukaan file untuk operasi pembacaan (default untuk objek-objek ifstream).
ios::nocreate
Pada mode ini, fungsi open() gagal jika file tidak ada.
ios::noreplace
Pada mode ini, fungsi open() gagal jika file ada.
ios::out
Mode pembukaan file untuk operasi penulisan (default untuk objek-objek ofstream).
ios::trunc
Mode untuk menghapus isi file jika file ada.

Program berikut mengilustrasikan kegunaan dari ios::app untuk menempatkan informasi di akhir file yang diciptakan pada program 10.19.

Program 10.21 Mengilustrasikan aplikasi dari mode ios::app

#include<iostream>
#include<fstream>
using namespace std;

int main()
{
   char Nama[40];
   char NoMhsw[11];
   int Usia;
   char Nilai[2];

   ofstream outfile ;

   outfile.open("Mahasiswa", ios::app); // outfile adalah nama aliran
   // "Mahasiswa" adalah nama file

   cout<<"Masukkan nilai mahasiswa: ";
   cin>> Nilai;
   outfile << Nilai;

   outfile.close();

   ifstream infile ("Mahasiswa"); //membaca aliran dari file

   cout<<"Hasil pembacaan dari file adalah: "<<endl;
   infile>>Nama;           //mengekstraksi nama dari file
   cout<<"Nama = "<<Nama<<endl;

   infile >>NoMhsw ; //mengekstraksi nomor mahasiswa
   cout<<"Reg.No= "<<NoMhsw<<endl;

   infile >> Usia;
   cout<<"Usia = "<<Usia<<endl;          //mengekstraksi usia mahasiswa

   infile>> Nilai;
   cout<<"Nilai = "<<Nilai<<endl;

   infile.close();

   return 0;
}
KELUARAN
Masukkan nilai mahasiswa: 78
Hasil pembacaan dari file adalah:
Nama = Kristof
Reg.No= 2015034
Usia = 22
Nilai = 78



10.12 Pointer File
Kapanpun modifikasi atas isi file diperlukan, adalah dibutuhkan untuk meraih atau mencapai spot di mana modifikasi diinginkan. File merupakan sebuah runtun byte dengan byte pertama adalah byte ke-nol. Untuk mencapai spot tertentu, Anda perlu mengetahui berapa jauh (banyak byte) spot itu dari awal file atau dari akhir file dengan pergerakan mundur. Pointer file menunjuk ke sebuah posisi di dalam file, yang ditentukan oleh offset (jumlah byte) dari awal atau dari akhir file.


GAMBAR 10.5 Posisi dari pointer file ketika file dibuka untuk operasi penulisan, pembacaan, dan append


Anda perlu memahami bahwa pointer file berbeda dari pointer yang telah Anda gunakan pada array dan kelas dimana pada kasus itu nilai pointer adalah alamat (jumlah byte dari byte awal) pada memori yang teralokasi di dalam RAM. Pointer file bukan alamat, ia hanya sebuah offset (dalam byte) dari awal file atau dari akhir file atau dari posisi terkini. Ketika sebuah file dibuka dengan mode pembacaan, maka pointer file diposisikan di awal file. Sama halnya, ketika file dibuka dengan mode penulisan, pointer file juga akan diposisikan ke awal file karena pembukaan dengan mode penulisan akan menghapus isi file, jadi pointer file selalu diposisikan ke awal file. Pada kasus mode append (penempatan sesuatu di akhir file), pointer file ditempatkan di akhir file untuk menambahkan informasi. Pada mode append, konten yang ada tetap utuh. Gambar 10.5 mengilustrasikan posisi pointer file untuk mode pembacaan, mode penulisan, dan mode append.

Pointer file yang dipakai untuk pembacaan file dari lokasi tertentu disebut dengan pointer get. Pointer file yang dipakai untuk penulisan file disebut dengan pointer put. Empat fungsi yang tercantum pada Tabel 10.7 dipakai untuk menggeser pointer ke sebuah lokasi di dalam file.

TABEL 10.7 Fungsi-fungsi untuk pointer file
Fungsi
File header
Penjelasan
seekg()
<ifstream>
Fungsi ini memindahkan pointer get ke lokasi yang ditetapkan oleh argumennya. Dipakai untuk pembacaan.
seekp()
<ofstresm>
Fungsi ini memindahkan pointer put ke lokasi yang ditetapkan oleh argumennya. Dipakai untuk penulisan.
tellg()
<ifstream>
Fungsi ini menghasilkan posisi terkini dari pointer get.
tellp()
<ofstream>
Fungsi ini menghasilkan posisi terkini dari pointer put.


FUNGSI seek() dan seekp()
Kedua fungsi ini memiliki dua argumen. Argumen pertama adalah sebuah nilai integer yang menetapkan offset dan argumen kedua adalah seek_dir yang menetapkan posisi referensi dari mana offset diukur, yaitu dari awal file, dari posisi terkini dari pointer file atau dari akhir file. Kode untuk ketiga referesi diberikan pada Tabel 10.8. Kode untuk memanggil kedua fungsi ini diilustrasikan berikut:

Seekg(int offset, posisi_referensi);
Seekp(int offset, posisi_referensi);

TABEL 10.8 Kode untuk posisi-posisi referensi
Kode untuk titik referensi
Penjelasan
ios::beg
Dari awal file.
ios::cur
Dari posisi terkini pada file.
ios::end
Dari akhir file.

Gambar 10.6 mengilustrasikan tiga referensi yang diberikan pada Tabel 10.8.


TABEL 10.9 Kode untuk argumen-argumen dari seekp() dan posisi dari pointer file
Opsi fungsi seekp()
Penjelasan
infile.seekp(0,ios::beg)
Pergi ke awal file untuk operasi penulisan.
infile.seekp(0,ios::cur)
Tetap berada di posisi terkini untuk operasi penulisan.
infile.seekp(0,ios::end)
Pergi ke akhir file untuk operasi penulisan.
infile.seekp(n,ios::beg)
Maju sejauh n byte dari awal file untuk operasi penulisan.
infile.seekp(n,ios::cur)
Maju sejauh n byte dari posisi terkini untuk operasi penulisan.
infile.seekp(-n,ios::end)
Mundur sejauh n byte dari akhir file untuk operasi penulisan.


GAMBAR 10.6 Titik-titik referensi untuk pointer-pointer file


Fungsi tellp() dan tellg() menghasilkan sebuah integer yang mengindikasikan posisi terkini dari pointer untuk operasi penulisan dan pembacaan. Program berikut mengilustrasikan aplikasi dari kedua fungsi ini berikut dengan fungsi seekp().

Program 10.22 Mengilustrasikan aplikasi dari fungsi seekp(), tellp(), tellg(), ios::in, dan ios::app

#include <fstream>
#include <iostream>
using namespace std;

int main ()
{
   ofstream outfile("Mfile");

   outfile<<"Kristof! Belajar pointer file C++\n"; //menuliskan ke file
  
   outfile.close();

   char str [80];

   ifstream infile ("Mfile");
   infile.getline(str,80); //membaca file
   cout<<str <<endl<<endl; //menampilkan pada monitor

   infile.close();                //menutup file

   infile.open ("Mfile", ios::in); //membuka file untuk pembacaan
   int g = infile.tellg(); //memberitahu posisi dari pointer get
   cout<<"Pointer pada posisi g = "<<g<<endl;
   //menampilkan posisi pointer

   outfile.open("Mfile", ios::app); //membuka file untuk penulisan di akhir

   outfile<<"yang menenentukan posisi di dalam file"; //menambahkan baris ini
   int p = outfile.tellp(); //memberitahu posisi dari pointer put.
   cout<<"Pointer berada pada posisi p = "<<p<<endl;

   infile.getline(str,80); //membaca baris pertama
   cout<<str<<endl;

   infile.getline(str,80); //membaca baris berikutnya
   cout<<str<<endl;

   outfile.seekp(5, ios::beg );          //pindah 5 byte dari awal file

   int n = outfile.tellp(); //memberitahu posisi pointer
   cout<<"Pointer berada pada posisi n = "<<n<<endl;

   outfile.seekp(-3, ios::cur ); //mundur sejauh 3 byte

   int m = outfile.tellp(); //memberitahu posisi pointer
   cout<<"Pointer berada pada posisi m = "<<m<<endl;

   outfile.close();

   infile.seekg(6, ios::end ); //mundur 6 byte dari akhir file
  
   int a = infile.tellg(); //memberitahu posisi pointer
   cout<<"Pointer berada pada posisi a = "<<a<<endl;

   outfile.close();
   infile.close();

   return 0;
}
KELUARAN
Kristof! Belajar pointer file C++

Pointer pada posisi g = 0
Pointer berada pada posisi p = 73
Kristof! Belajar pointer file C++
yang menenentukan posisi di dalam file
Pointer berada pada posisi n = 5
Pointer berada pada posisi m = 2
Pointer berada pada posisi a = 79



10.13 File Biner dan Himpunan Kode Karakter ASCII
Anda tentu tahu bahwa komputer menyimpan semua jenis data dalam runtun-runtun biner yang memuat nol-nol dan satu-satu. Namun, format biner akan berbeda jika Anda menyimpan sebuah dijit sebagai suatu karakter untuk menyimpannya sebagai nilai numeris yang direpresentasikannya. Hal ini karena nilai sebagai sebuah karakter, berbeda dari nilai numeris yang direpresentasikan oleh dijit itu. Sebagai contoh, nilai 1242 memiliki nilai numeris seribu dua ratus empat puluh dua. Jika nilai itu disimpan sebagai short int, maka akan diperlukan dua byte dan representasi binernya adalah 10011011010, yang dinamakan dengan format biner yang disimpan seperti diilustrasikan berikut.


GAMBAR 10.7(a) Nilai 1242 disimpan dalam biner

Menyimpan nilai yang sama sebagai karakter-karakter dijit memerlukan 4 byte. Satu karakter dialokasikan 1 byte.


GAMBAR 10.7(b) Menyimpan nilai yang sama (1242) sebagai karakter-karakter dijit


Pada monitor atau pada printer, yang ditampilkan atau dicetak adalah karakter-karakter. Jadi, nilai numeris yang disimpan di dalam memori sebagai nilai dijit dikonversi menjadi format karakter dan ditampilkan. Sama halnya, ketika Anda memasukkan nilai numeris dari sebuah variabel dari keyboard, Anda sebenarnya memasukkannya sebagai karakter dan format karakter dari sebuah dijit dikonversi menjadi nilai numeris dan disimpan sebagai nilai dari variabel di dalam memori komputer.



10.14 Fungsi write() dan read() untuk Operasi File
Anda telah mempelajari format biner dan format karakter dari nilai-nilai numeriks. Fungsi write() dan read() memproses file dalam format biner. Ini adalah format yang dilakukan dalam penyimpanan di dalam memori komputer. Fungsi get() dan put() yang didiskusikan pada awal bab ini memproses file dalam format karakter.

Program 10.23 Mengilustrasikan aplikasi dari fungsi read() dan write() untuk operasi file

#include <fstream>
#include <iostream>
using namespace std;

int main ()
{
   int Array[5] = { 5, 6, 7, 8, 9};

   ofstream outfile ("fileKu");

   for (int i=0 ; i<5 ; i++)
      outfile.write((char*) &Array, 5);

   outfile.close();

   ifstream infile ("fileKu");

   infile.read((char *) &Array, 5);

   for (int k =0;k<5 ; k++)
      cout<<"Array["<<k<<"] = "<<Array[k]<<" dan ukuran dalam byte = "
          <<sizeof(Array[k])<< endl;

   return 0;
}
KELUARAN
Array[0] = 5 dan ukuran dalam byte = 4
Array[1] = 6 dan ukuran dalam byte = 4
Array[2] = 7 dan ukuran dalam byte = 4
Array[3] = 8 dan ukuran dalam byte = 4
Array[4] = 9 dan ukuran dalam byte = 4



10.15 Operasi File untuk Objek Kelas
Fungsi write() dan read() yang diilustrasikan di atas dapat dipakai untuk menyimpan data objek ke dalam file dan membaca data objek tersebut dari file ketika diperlukan. Karena anggota-anggota data objek disimpan secara sekuensial, objek dapat diperlukan sebagai unit tunggal yang menempati sejumlah byte yang sama dengan ukurannya. Ukuran objek, yang diperlukan oleh kedua fungsi ini, bisa diperoleh dengan fungsi size(). Pembacaan dan penulisan data dilakukan dengan cara yang sama ketika ia disimpan di dalam memori komputer. Namun, data objek hanya memuat anggota-anggota data dan bukan angggota-anggota fungsi kelas. Pada program kelas, semua objek memakai bersama salinan dari fungsi-fungsi anggota. Jadi, anggota-anggota fungsi tidak disimpan dengan objek apapun. Bahkan tipe objek tidak disimpan bersama dengan data objek. Ini akan menimbulkan masalah serius ketika objek-objek dari beberap kelas disimpan di dalam file yang sama. Jika program mengetahui tipe data yang dibaca dari file, maka ia dapat mengkonstruksi objek dari data itu. Sebaliknya, informasi tentang tipe objek harus diinkorporasikan dengan mengeoverload operator penyisipan. Program berikut mengilustrasikan fungsi write() dan read() untuk menulis dan membaca objek-objek dari suatu kelas.

Program 10.24 Mengilustrasikan operasi-operasi file dengan objek-objek kelas

#include <fstream>
#include <iostream>
using namespace std;

class ObNilai
{
   private:
      char Nama[30];
      int NoMhsw;
      char nilai;

   public:
      void Baca()
      {
         cout<<"Masukkan nama mahasiswa: ";
         cin>>Nama;

         cout<<"Masukkan nomor mahasiswa: ";
         cin>>NoMhsw;

         cout<<"Masukkan nilai: ";
         cin>>nilai;
      }

      void Tulis()
      {
         cout.width(27);
         cout.setf(ios::left);

         cout<<Nama;
         cout.width(10);
         cout.setf(ios::left);

         cout<<NoMhsw;
         cout.width(2);
         cout.setf(ios::left);

         cout<<nilai<<endl;
      }
};

int main ()
{
   ifstream infile ("STDfile");
   ofstream outfile ("STDfile");

   cout<<"Masukkan nama, no.mhsw, dan nilai: \n";
   ObNilai Nil[4];

   for (int j=0; j<4; j++ )
   {
      Nil[j].Baca();
      outfile.write((char*) & Nil[j], sizeof(Nil[j]));
   }

   outfile.close();

   cout<<"\nDaftar nilai mahasiswa\n";
   cout<<"Nama \t\t NoMhsw\t Nilai"<<endl;
   for (int i =0; i<4;i++)
   {
      infile.read((char*)& Nil[i], sizeof(Nil[i]));
      Nil[i].Tulis();
   }

   infile.close();

   return 0;
}
KELUARAN
Masukkan nama, no.mhsw, dan nilai:
Masukkan nama mahasiswa: Kristof
Masukkan nomor mahasiswa: 2015001
Masukkan nilai: A
Masukkan nama mahasiswa: John
Masukkan nomor mahasiswa: 2015002
Masukkan nilai: B
Masukkan nama mahasiswa: Vivian
Masukkan nomor mahasiswa: 2015003
Masukkan nilai: A
Masukkan nama mahasiswa: Sihol
Masukkan nomor mahasiswa: 2015004
Masukkan nilai: B

Daftar nilai mahasiswa
Nama             NoMhsw  Nilai
Kristof                    2015001   A
John                       2015002   B
Vivian                     2015003   A
Sihol                      2015004   B



10.16 Fungsi Penanganan Error
Operasi-operasi I/O yang sama seperti operasi komputer lain rawan terhadap error, yang bisa disebabkan oleh programer atau karena keterbatasan perangkat keras seperti ketidak-cukupan memori. Error dapat disebabkan oleh hal-hal berikut:
a.        Penggunaan nama file yang salah.
b.       User mencoba membaca file yang tidak ada.
c.        User mencoba menulis ke dalam file yang dibuka hanya untuk operasi pembacaan.
d.       User mencoba membuka sebuah file read-only untuk operasi penulisan.
e.        User mencoba membuka sebuah file baru dengan nama file yang telah ada.
f.        User mencoba membaca file ketika pointer file telah ditetapkan di akhir file.
g.       Ruang memori yang tidak cukup.
h.        Permasalahan perangkat keras.


BENDERA STATUS ALIRAN
Untuk menangani kondisi-kondisi error aliran, kelas ios_base mendeklarasikan sebuah tipe enumerasi dengan anggota-anggota berikut. Hal ini dijelaskan pada Tabel 10.10.

goodbit = 0x00
badbit = 0x01
eofbit = 0x02
failbit = 0x04

TABEL 10.10 Bit status ditetapkan berdasarkan kondisi
Bit
Penjelasan
goodbit
Bit ini ditetapkan 1 (true) ketika tidak ada bit-bit lain bernilai 1. Ini dideteksi dengan cin.good();
badbit
Ini ditetapkan 1 ketika error terjadi karena hilangnya data. Ini dideteksi dengan cin.bad();
eofbit
Bit dari akhir file bernilai 1 untuk aliran masukan ketika akhir file dijumpai. Ini dideteksi dengan cin.eof();
failbit
Bit ini bernilai 1 ketika error format terjadi di dalam aliran. Data hilang karena error semacam itu. Ini dideteksi dengan cin.fail();

Fungsi-fungsi yang tercantum pada Tabel 10.11 memeriksa status dari bit-bit error dan menghasilkan nilai-nilai seperti dijelaskan pada tabel.

TABEL 10.11 Fungsi-fungsi penanganan error
Fungsi
Penjelasan
bad()
Menghasilkan true ketika sebuah error terjadi, false jika sebaliknya.
good()
Menghasilkan true ketika tidak ada error yang terjadi, false jika sebaliknya.
clear()
Fungsi ini membersihkan status-status error.
eof()
Fungsi ini menghasilkan true ketika akhir file dideteksi.
fail()
Menghasilkan true jika sebuah operasi, misalnya, pembacaan atau penulisan, gagal. Fungsi ini memeriksa bit-bit error.
rdstate()
Menghasilkan data status aliran.


Program 10.25 Mengilustrasikan fungsi-fungsi status aliran

#include<iostream>
using namespace std;

int main()
{
   double D;

   cout<<"Status awal dari aliran: "<<endl;

   cout<<"cin.bad = "<<cin.bad()<<endl;
   cout<<"cin.good = "<<cin.good<<endl;

   cout<<"cin.fail= "<<cin.fail()<<endl;
   cout<<"cin.eof = "<<cin.eof()<<endl;

   cout<<"Masukkan nilai D: ";
   cin>>D;

   cout<<"User telah memasukkan sebuah string untuk nilai D (seharusnya double)."<<endl;
   cout<<"Status aliran setelah masukan tersebut"<<endl;

   cout<<"cin.bad = "<<cin.bad()<<endl;
   cout<<"cin.good = "<<cin.good<<endl;

   cout<<"cin.fail= "<<cin.fail()<<endl;
   cout<<"cin.eof = "<<cin.eof()<<endl;

   cin.clear();

   cout<<"Setelah menerapkan fungsi clear(): "<<endl;

   cout<<"cin.bad = "<<cin.bad()<<endl;
   cout<<"cin.good = "<<cin.good<<endl;

   cout<<"cin.fail= "<<cin.fail()<<endl;
   cout<<"cin.eof = "<<cin.eof()<<endl;

   return 0;
}
KELUARAN
Status awal dari aliran:
cin.bad = 0
cin.good = 1
cin.fail= 0
cin.eof = 0
Masukkan nilai D: kristof
User telah memasukkan sebuah string untuk nilai D (seharusnya double).
Status aliran setelah masukan tersebut
cin.bad = 0
cin.good = 1
cin.fail= 1
cin.eof = 0
Setelah menerapkan fungsi clear():
cin.bad = 0
cin.good = 1
cin.fail= 0
cin.eof = 0



LATIHAN
1.       Apa itu aliran masukan/keluaran?
2.       Apa yang Anda pahami tentang I/O level rendah dan I/O level tinggi?
3.       Apa kelas-kelas aliran untuk mengelola I/O dengan konsol?
4.       Dari kelas aliran I/O manakah objek-objek berikut dihasilkan?
a.        cout
b.       cin
c.        cerr
d.       clog
5.       Apakah perbedaan antra fungsi put() dan fungsi write()?
6.       Jelaskan perbedaan antara fungsi get() dan getline().
7.       Apa itu pointer file? Mengapa Anda tidak bisa menggunakan pointer biasa pada kasus file?
8.       File header apa yang perlu dicantumkan agar Anda dapat bekerja dengan manipulator-manipulator terparameterisasi?
9.       Untuk tipe data apakah agar fungsi precision() dapat diterapkan?
10.    Apa itu penyejajaran kiri dan penyejajaran kanan? Bagaimana keduanya ditetapkan?
11.    Apa yang dilakukan oleh fungsi ignore()?
12.    Jelaskan aksi dari fungsi peek()?
13.    Untuk apakah manipulator-manipulator berikut digunakan?
a.        oct
b.       hex
c.        dec
14.    Bagaimana Anda mendeklarasikan file out_aliran dan in_aliran?
15.    Kelas-kelas aliran apa yang perlu dicantumkan untuk melakukan operasi pembacaan dan penulisan file?
16.    Apa itu bendera pemformatan? Aksi apakah yang dilakukan oleh bendera-bendera berikut?
a.       ios::fixed
b.      ios::scientific
c.       ios::left
d.      ios::oct
17.    Apa yang Anda pahami dari kode berikut?

a.        infile.seekp(n, ios::beg)
b.       infile.seekp(n, ios::cur)
c.        infile.seekp(–n, ios::end)
18.    Apa itu mode-mode pembukaan file?
19.    Apa yang Anda pahami dari mode-mode pembukaan file berikut?
a.        ios::binary
b.       ios::in
c.        ios::nocreate
20.    Tunjukkan keluaran dari statemen-statemen berikut:
a.        cout.width (20)<<“ John Kristof ”<<endl;
b.       cout<<scientific<<3543.14159 ;
c.        cout<<“Selamat\nMalam”<<“\nJohn\n”;
d.       cout<<setw(20)<<setprecision (4)<<53426.87566;
e.        cout<<hex<<484<<oct<<400;
21.    Tunjukkan keluaran dari statemen-statemen berikut:
a.        cout.fill(‘*’);
b.       cout.width(10);
c.        cout<< 8546<<endl;
d.       cout<<“Hallo! \t Selamat siang\n;”
22.    Apa yang Anda pahami dari bit-bit status error berikut?
a.        failbit
b.       badbit
c.        goodbit
23.    Apa yang dilakukan oleh fungsi-fungsi berikut?
a.        good()
b.       clear()
c.        eof()
d.       fail()
24.    Apa perbedaan antara format karakter dan format biner?





No comments: