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.
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.
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.
|
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.
Menyimpan nilai yang sama sebagai karakter-karakter dijit memerlukan 4
byte. Satu karakter dialokasikan 1 byte.
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:
Post a Comment