Input/Output with files
C++ mendukung proses input dan output file dengan menggunakan class-class berikut: • ofstream: File class untuk operasi menulis (diturunkan dari ostream)
• ifstream: File class untuk operasi membaca (diturunkan dari istream) • fstream: File class untuk operasi membaca dan menulis (diturunkan dari
iostream)
Open a file
Operasi pertama yang dilakukan pada object ini adalah mengasosiasikannya dengan suatu file, yang mana disebutkan sebagai membuka file. File yang terbuka dinyatakan dalam program sebagai suatu objek stream (suatu instant dari salah satu class diatas) dan setiap input atau output pada object stream tersebut akan dilakukan terhadap file fisiknya Untuk membuka suatu file dengan suatu object strean, kita dapat menggunakan fungsi
open():
void open (const char * filename, openmode mode);
dimana filename adalah suatu karakter string dari nama file yang akan dibuka dan mode
adalah kombinasi dari flag berikut :
ios::in Open file for reading ios::out Open file for writing
ios::ate Initial position: end of file
ios::app Every output is appended at the end of file ios::trunc If the file already existed it is erased ios::binary Binary mode
Flag-flag ini dapat dikombinasikan dengan menggunakan operator bitwise OR: |. Sebagai contoh, jika kita ingin membuka file "example.bin" dalam mode binary untuk menambah data, kita dapat melakukannya dengan memanggil fungsi open:
ofstream file;
file.open ("example.bin", ios::out | ios::app | ios::binary);
Berikut adalah default mode yang akan digunakan pada masing-masing class ofstream,
ifstream dan fstream :
class default mode to parameter
ofstream ios::out | ios::trunc
ifstream ios::in
fstream ios::in | ios::out
Default value hanya diaplikasikan jika fungsi dibuka tanpa menyebutkan suatu parameter
mode.
Kita dapat juga menggunakan konstruktor dari masing-masing class dengan penulisan berikut :
ofstream file ("example.bin", ios::out | ios::app | ios::binary);
Kita dapat memeriksa apakah file telah terbuka dengan benar dengan menggunakan fungsi is_open():
bool is_open();
yang mana akan mengembalikan suatu nilai bool dengan nilai true jika object berasosiasi dengan suatu file yang terbuka dan sebaliknya false.
Closing a file
Ketika kita telah selesai membaca, dan menulis maka file tersebut harus ditutup dengan memanggil fungsi close(), hal ini akan mencurahkan seluruh isi buffer yang tertahan ke file yang ditutup. Bentuknya cukup sederhana:
void close ();
Begitu anggota dari fungsi ini dipanggil, objek stream dapat digunakan untuk membuka file lain, dan file tersebut juga dapat dibuka oleh proses lain.
Dalam hal ini, jika objek dihapus dengan masih adanya asosiasi file yang terbuka, maka destructor akan secara otomatis memanggil fungsi close.
Text mode files
Class-class ofstream, ifstream dan fstream adalah inheritance dari ostream, istream
dan iostream. Oleh sebab itu objek fstream dapat menggunakan member yang terdapat pada class parentnya.
Umumnya, ketika menggunakan text file kita akan menggunakan member seperti pada console ( yaitu cin dan cout). Pada contoh berikut kita akan menggunakan overloaded insertion operator <<: J )$ @% A .3 K % 0 % .M 0 0 M3L % . 0 % U .33 K 0 % @@ M2 O ML 0 % @@ M2 O ML 0 % .3L P ) L P file example.txt This is a line.
This is another line.
Data input dari file dapat juga dilakukan dengan cara yang sama seperti yang kita lakukan pada cin: J )$ @ A J )$ @% A J )$ @ $ A .3 K )%% B CL % 0 % .M 0 0 M3L % .E 0 % U .33 K ) @@ M7 % ML 0 . 3L P - .E 0 % %.3 3 K 0 % . )%% ( 3L This is a line.
) @@ )%% @@ $ L P
) L
P
Binary files
Pada binary file proses input/ouput data tidak dapat menggunakan operator seperti << dan
>> serta fungsi seperti getline.
Untuk binary file class fstream memiliki prototype write dan read berikut :
write ( char * buffer, streamsize size ); read ( char * buffer, streamsize size );
Contoh :
file.write((char*)&x, sizeof(x)); file.read((char*)&x, sizeof(x));
Dimana buffer adalah alamat dari memory block yang menyimpan data hasil
pembacaan atau yang akan ditulis.
J )$ @ A J )$ @% A % H M 0 0 ML .3 K )%% L D L % % .% ( 66 = 66 = 66 3L D H % .3L % / . ( 66 3L )%% H - B D CL % $ . )%% ( D 3L % .3L ) @@ M % )%% ML $ BC )%% L ) L P
the complete file is in a buffer
Verification of state flags
Selain fungsi eof() untuk memeriksa posisi end of file, juga disediakan beberapa
member function untuk memeriksa status dari stream (semuanya akan menghasilkan nilai
bad()
Mengembalikan true kalau ada kegagalan dalam operasi membaca atau menulis
fail()
Mengembalikan true dalam kasus yang sama pada bad() khususnya dalam kasus dimana terjadi format error, seperti mencoba membaca suatu nilai integer dan yang diterima adalah character.
eof()
Mengembalikan true jika sebuah file yang terbuka untuk dibaca telah mencapai end of file.
good()
Seperti namanya, mengembalikan false atau true berdasarkan hasil operasi terakhir.
Untuk melakukan reset terhadap state flags dapat digunakan function clear().
get and put stream pointers
Pada semua objek i/o stream memiliki minimal satu stream pointer:
• ifstream, demikian juga istream, memiliki get pointer yang menunjuk pada lokasi elemen berikutnya yang akan dibaca.
• ofstream, demikian juga ostream, memiliki put pointer yang menunjuk pada lokasi penulisan elemen berikutnya.
• Akhirnya fstream, demikian juga iostream, memiliki get and put
Pointer-pointer Stream ini dapat dimanipulasi dengan beberapa member function berikut :
tellg() dan tellp()
Mengembalikan nilai integer yang menunjukan posisi dari get stream pointer dan put stream pointer.
seekg() dan seekp()
Member function ini untuk mengatur posisi get stream pointer dan put stream pointer dengan prototypes:
seekg ( pos_type position ); seekp ( pos_type position );
dengan nilai relatif terhadap begin of file. atau
seekg ( off_type offset, seekdir direction ); seekp ( off_type offset, seekdir direction );
ios::beg offset specified from the beginning of the stream
ios::cur offset specified from the current position of the stream pointer ios::end offset specified from the end of the stream
Contoh berikut menggunakan member fungsi diatas untuk mendapatkan ukuran dari suatu binary file:
! J )$ @ A J )$ @% A % H M 0 0 ML .3 K ( L % % .% ( 66 = 66 3L H % .3L % / . ( 66 $3L H % .3L % .3L ) @@ M D % M @@ % L ) @@ M M @@ . 3 @@ M O ML ) L P
size of example.txt is 40 bytes.
Buffers and Synchronization
Ketika kita bekerja dengan file streams, kita sebenarnya bekerja pada suatu buffer dari type streambuf. Buffer ini merupakan suatu memory block yang berlaku sebagai intermediasi antara stream dengan file secara fisik. Misalnya ketika function put
(menulis sebuah karakter tunggal) dipanggil, karakter tersebut tidak secara langsung ditulis ke file fisik, tetapi disisipkan pada buffer untuk stream tersebut
Ketika buffer dicurahkan, semua data yang terkandung didalamnya akan ditulis ke media fisik (jika merupakan out stream) atau dihapus (jika merupakan in stream). Proses ini disebut sebagai synchronization dan terjadi dengan kondisi berikut:
• Ketika file di tutup: sebelum suatu file ditutup semua buffer akan di sinkron • Ketika buffer telah penuh: Buffer memiliki ukuran tertentu, ketika telah penuh
secara otomatis akan di sinkron.
• Ditegaskan dengan perintah: Ketika perintah perintah seperti flush dan endl yang menyebabkan proses sinkron.
• Ditegaskan dengan function sync(): Pemanggilan function sync() (tanpa parameter) menyebabkan sinkron dilakukan.
Reading and Writing Complex Data
Walaupun metode read dan write methods mengunakan suatu char* pointer, tetapi tidak selamanya data yang akan dibaca atau ditulis harus berupa char array. Anda dapat membaca dan menulis data struct dengan menggunakan simple type casting of pointers:
#include "fstream.h" struct { char nama[20]; int age; }teman; int main() { ofstream fout; fout.open("teman.rec",ios::out || ios::binary); strcpy(teman.nama,"hendra soewarno"); teman.age = 31; fout.seekp(0); fout.write((char*)&teman, sizeof(teman)); strcpy(teman.nama,"susan dewichan"); teman.age = 30; fout.seekp(sizeof(teman)); fout.write((char*)&teman, sizeof(teman)); fout.close(); return 0; } #include "iostream.h" #include "fstream.h" struct { char nama[20]; int age; }teman; int main() { ifstream fin; fin.open("teman.rec",ios::in || ios::binary); fin.seekg(0); fin.read((char*)&teman, sizeof(teman)); cout << teman.nama << endl;
cout << teman.age << endl; fin.seekg(sizeof(teman));
fin.read((char*)&teman, sizeof(teman)); cout << teman.nama << endl;
cout << teman.age << endl; fin.close();
return 0; }
//Program random access file //Oleh : Hendra Soewarno
//Dengan memanfaatkan fasilitas fstream. #include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <string.h> struct siswa { char nim[10]; char nama[20]; float teori,praktek; } dsiswa; fstream fsource;
void bukafile(char namafile[]);
void bacadata(); void cetakdata(); void tutupfile(); int main() { bukafile("c:\siswa.dat"); bacadata(); cetakdata(); tutupfile(); return 0; }
void bukafile(char namafile[]) {
fsource.open(namafile,ios::in | ios::out | ios::binary); } void bacadata() { float recno; char nim[10]; fsource.seekg(0,ios::end); do {
recno = fsource.tellg()/sizeof(dsiswa); cout << "Record ke -" << recno+1 << endl; cout << "Nim : "; cin.getline(nim,10); if (nim[0] != 0) {
strcpy(dsiswa.nim,nim);
cout << "Nama : "; cin >> dsiswa.nama; cout << "Teori : "; cin >> dsiswa.teori; cout << "Praktek: "; cin >> dsiswa.praktek; cin.ignore();
fsource.write((char*) &dsiswa,sizeof(dsiswa)); }
} while (nim[0] != 0); } void cetakdata() { fsource.seekg(0,ios::beg); cout << "---"<< endl; cout << " Nim Nama Teori Praktek "<< endl; cout << "---"<< endl;
while (!fsource.eof()) {
fsource.read((char *) &dsiswa,sizeof(dsiswa)); if (fsource.gcount() == 0) break;
cout << setw(10) << dsiswa.nim; cout << setw(20) << dsiswa.nama;
cout << setw(5) << setprecision(2) << dsiswa.teori;
cout << setw(5) << setprecision(2) << dsiswa.praktek<<endl; } } void tutupfile() { fsource.close(); }
Pertanyaan
1. Apa tujuan pemakaian fungsi open pada suatu stream?
2. Tuliskan suatu deklarasi untuk suatu input stream dan hubungkan dengan suatu file yang disebut 'datain.txt'. Bagaimana anda membaca suatu nilai real dari stream ini ke suatu vairabel float?
3. Tuliskan suatu deklarasi untuk suatu output stream dan hubungkan dengan suatu file yang disebut sebagai result 'results'. Andaikan telah tersedia variabel float x dan y, bagaimana anda mencetak pesan ‘nilai dari x dan y adalah …’ kedalam file tersebut?
Latihan
1. Tuliskan sebuah program untuk menyimpan data teman anda ke dalam suatu binary file, sediakan fasilitas tambah, perbaiki, hapus, tampil, cari (dengan nama), dan fasilitas cetak ke printer. Petunjuk : gunakan suatu pendekatan pemrograman terstruktur.