Translate

tutorial pointer halaman 3

tutorial pointer halaman 3

Selamat datang di eagleboot dan selamat membaca.

terry berisi nilai 1702 dan bukan 'h' atau "hello", walaupun 1702 menunjuk pada karakter tersebut. Sehingga jika akan dilakukan perubahan pada karakter 'o' diganti dengan tanda '!' maka ekspresi yang digunakan ada 2 macam :  terry[4] = '!'; *(terry+4) = '!';  Penulisan terry[4] dan *(terry+4), mempunyai arti yang sama. Jika digambarkan:  ‘h’ ‘e’‘l’‘l’‘!’‘\0’  1702 17031704170517061707    terry 1702  terry[4]   *(terry+4)   Gambar 13.8 Deklarasi “Hello” pada Alamat Terry[4] Diisi !  Perhatikan contoh program dibawah, dimana char memerlukan 1 byte, short memerlukan 2 bytes dan long memerlukan 4. Terdapat 3 buah pointer :  char*mychar; short*myshort; long*mylong;  ekspresi diatas akan menunjuk pada lokasi dimemory masing-masing 1000, 2000 and 3000, sehingga jika dituliskan :  mychar++;myshort++;mylong++;  mychar, akan bernilai 1001, myshort bernilai 2002, dan mylong bernilai 3004. Alasannya adalah ketika terjadi pertambahan maka akan ditambahkan dengan tipe yang sama seperti yang didefinisikan berupa ukuran dalam bytes 

Perhatikan ekspresi dibawah ini :  *p++;*p++=*q++;  Ekspresi pertama equivalen dengan *(p++) dan yang dilakukan adalah menambahkan p (yaitu alamat yang ditunjuk, bukan nilai yang dikandungnya).  Ekspresi kedua, yang dilakukan pertama adalah memberikan nilai *q ke *p dan kemudian keduanya ditambahkan 1 atau dengan kata lain :  *p=*q;p++;q++;  Tipe pointer void merupakan tipe khusus. void pointers dapat menunjuk pada tipe data apapun, nilai integer value atau float, maupun string atau karakter. Keterbatasannya adalah tidak dapat menggunakan operator asterisk (*), karena panjang pointer tidak diketahui, sehingga diperlukan operator type casting atau assignations untuk mengembalikan nilai void pointer ketipe data sebenarnya. 

 Program 13.3 include<iostream.h> usingnamespacestd; voidincrease(void*data,inttype) { switch(type) { casesizeof(char):(*((char*)data))++;break; casesizeof(short):(*((short*)data))++;break; casesizeof(long):(*((long*)data))++;break; } } intmain() { chara=5; shortb=9; longc=12; increase(&a,sizeof(a)); increase(&b,sizeof(b)); increase(&c,sizeof(c)); cout<<(int)a<<","<<b<<","<<c; return0; } 

 Keluaran program diatas adalah sebagai berikut: 6,10,13 

Next read halaman 4.
tutorial pointer halaman 3

tutorial pointer halaman 3

Selamat datang di eagleboot dan selamat membaca.

terry berisi nilai 1702 dan bukan 'h' atau "hello", walaupun 1702 menunjuk pada karakter tersebut. Sehingga jika akan dilakukan perubahan pada karakter 'o' diganti dengan tanda '!' maka ekspresi yang digunakan ada 2 macam :  terry[4] = '!'; *(terry+4) = '!';  Penulisan terry[4] dan *(terry+4), mempunyai arti yang sama. Jika digambarkan:  ‘h’ ‘e’‘l’‘l’‘!’‘\0’  1702 17031704170517061707    terry 1702  terry[4]   *(terry+4)   Gambar 13.8 Deklarasi “Hello” pada Alamat Terry[4] Diisi !  Perhatikan contoh program dibawah, dimana char memerlukan 1 byte, short memerlukan 2 bytes dan long memerlukan 4. Terdapat 3 buah pointer :  char*mychar; short*myshort; long*mylong;  ekspresi diatas akan menunjuk pada lokasi dimemory masing-masing 1000, 2000 and 3000, sehingga jika dituliskan :  mychar++;myshort++;mylong++;  mychar, akan bernilai 1001, myshort bernilai 2002, dan mylong bernilai 3004. Alasannya adalah ketika terjadi pertambahan maka akan ditambahkan dengan tipe yang sama seperti yang didefinisikan berupa ukuran dalam bytes 

Perhatikan ekspresi dibawah ini :  *p++;*p++=*q++;  Ekspresi pertama equivalen dengan *(p++) dan yang dilakukan adalah menambahkan p (yaitu alamat yang ditunjuk, bukan nilai yang dikandungnya).  Ekspresi kedua, yang dilakukan pertama adalah memberikan nilai *q ke *p dan kemudian keduanya ditambahkan 1 atau dengan kata lain :  *p=*q;p++;q++;  Tipe pointer void merupakan tipe khusus. void pointers dapat menunjuk pada tipe data apapun, nilai integer value atau float, maupun string atau karakter. Keterbatasannya adalah tidak dapat menggunakan operator asterisk (*), karena panjang pointer tidak diketahui, sehingga diperlukan operator type casting atau assignations untuk mengembalikan nilai void pointer ketipe data sebenarnya. 

 Program 13.3 include<iostream.h> usingnamespacestd; voidincrease(void*data,inttype) { switch(type) { casesizeof(char):(*((char*)data))++;break; casesizeof(short):(*((short*)data))++;break; casesizeof(long):(*((long*)data))++;break; } } intmain() { chara=5; shortb=9; longc=12; increase(&a,sizeof(a)); increase(&b,sizeof(b)); increase(&c,sizeof(c)); cout<<(int)a<<","<<b<<","<<c; return0; } 

 Keluaran program diatas adalah sebagai berikut: 6,10,13 

Next read halaman 4.
tutorial pointer halaman 2

tutorial pointer halaman 2

Selamat datang di eagleboot dan selamat membaca.

Gambar 13.2. Operator Alamat (&)  Dengan menggunakan pointer, kita dapat mengakses nilai yang tersimpan secara langsung dengan memberikan awalan operator asterisk (*) pada identifier pointer, yang berarti "value pointed by". Contoh :  beth=*ted;  (dapat dikatakan:"beth sama dengan nilai yang ditunjuk oleh ted") beth = 25, karena ted dialamat 1776, dan nilai yang berada pada alamat 1776 adalah 25. 


Ekspresi dibawah ini semuanya benar, perhatikan pernyataan program dibawah:  andy==25 &andy==1776 ted==1776 *ted==25  Ekspresi pertama merupakan assignation bahwa andy=25;. Kedua, menggunakan operator alamat (address/derefence operator (&)), sehingga akan mengembalikan alamat dari variabel andy. Ketiga bernilai benar karena assignation untuk ted adalah ted = &andy;. Keempat menggunakan reference operator (*) yang berarti nilai yang ada pada alamat yang ditunjuk oleh ted, yaitu 25. Maka ekspresi dibawah ini pun akan bernilai benar :  *ted==andy  

13.2. Deklarasi variabel bertipe pointer 

 Variabel pointer sering dikatakan sebagai variabel yang menunjuk ke obyek lain. Pada kenyataan yang sebenarnya, variabel pointer berisi alamat dari suatu obyek lain (yaitu obyek yang dikatakan ditunjuk oleh pointer). Sebagai contoh, px adalah variable pointer dan x adalah variabel yang ditunjuk oleh px. Kalau x berada pada alamat memori (alamat awal) 1000, maka px akan berisi 1000. Sebagaimana diilustrasikan pada gambar di bawah ini.
Gambar 13.4. Variabel pointer px menunjuk ke variabel x  Suatu variabel pointer dideklarasikan dengan bentuk sebagai berikut :   
  Gambar 13.7. deklarasi variabel pointer  Dimana type merupakan tipe dari data yang ditunjuk, bukan tipe dari pointer- nya. Dengan tipe dapat berupa sembarang tipe yang sudah dibahas pada bab-bab sebelumnya, maupun bab-bab berikutnya. Adapun nama_var_pointer adalah nama dari variabel pointer. Perhatikan contoh berikut ini: int*px; char*pch1,*pch2; float*greatnumber;  Contoh pertama menyatakan bahwa px adalah variabel pointer yang menunjuk ke suatu data bertipe int, sedangkan contoh kedua masing pch1 dan pch2 adalah variabel pointer yang menunjuk ke data bertipe char.  1000 ? X px zzzz 1000 Alamat  tipe_data *nama_var_pointer char, float, int, double, long, operator bintang/ asterisk (*



13.3. Inisialisasi Pointer  Dalam melakukan pemrogaman dengan menggunakan pointer yang pertama perlu dilakukan dalam membuat program adalah dengan melakukan inisialisasi pointer tersebut. Untuk lebih jelasnya perhatikan contoh dibawah ini:  intnumber;int*tommy=&number;  pernyataan diatas akan sama atau ekivalen dengan pernyataan dibawah ini:  intnumber;int*tommy;tommy= &number;  Seperti pada array, inisialisasi isi dari pointer dapat dilakukan dengan deklarasi seperti contoh berikut :  char*terry="hello";  Misalkan kata "hello" disimpan pada alamat 1702 dan seterusnya, maka deklarasi tadi dapat digambarkan sebagai berikut:

Next read halaman 3.
tutorial pointer  lengkap

tutorial pointer lengkap

Selamat datang di eagleboot dan selamat membaca.

BAB 13 POINTER  

13.1 Pemrograman pointer 
13.2 Deklarasi variabel bertipe pointer  
13.3 Inisialisasi Pointer  
13.4 Pointer untuk fungsi  
13.5 Mengakses dan Mengubah isi Pointer  
13.6 Array dan Pointer
 13.7 Pointer dalam Fungsi  
13.8 Fungsi Pointer ke Static Class Member Function  
13.9 Fungsi Pointer pada Class anggota Fungsi Non-static.

13.1. Pemrograman pointer

 Pada programmer pemula hal yang sulit dipahami adalah pointer. Pointer adalah pada dasarnya sama dengan veriabel lain. Dengan pointer setiap variable diletakan pada alamat memori yang besarnya cukup untuk menampung nilai dari sebuah variable tipe data. Pada sebuah komputer PC misalnya satu byte data secara umum dialokasikan untuk tipe data char, 2 byte untuk tipe data short, 4 byte untuk tipa data int, long dan float serta 8 byte untuk tipe data double. Tiap-tiap byte data memori mempunyai alamat yang unik. Sebuah variable alamat  merupakan alamat dimana sebuah byte data pertama dapat dialokasikan. Sebagai contoh misalnya dapat didefinisikan dalam program sebagai berikut; charhuruf; shortangka; floatamount;  sehingga pengaturan memorinya dapat diilustrasikan sebagai berikut 


Pada gambar diatas variable letter diletakan pada alamat 1200, number pada alamat 1201 dan amount pada alamat 1203. Ketika programmer mendeklarasikan sebuah variable, sama halnya dengan menginformasikan compiler dua sesuatu yaitu : nama variable dan tipe variable. Misalnya kita akan mendeklarasikan tipe variable integer dengan nama variable k sehingga dapat ditulis: Intk  Pada tipe variable integer merupakan tipe data yang digunakan compiler dimana memori yang terpakai adalah dua byte. Setiap kali komputer menyimpan data, maka sistem operasi akan mengorganisasikan lokasi pada memori pada alamat yang unik. Misal untuk alamat memori 1776, hanya sebuah lokasi yang memiliki alamat tersebut. Dan alamat 1776 pasti terletak antara 1775 dan 1777. Dalam pointer, terdapat 2 jenis operator yang biasa digunakan. Kegunaan pointer yang utama adalah untuk menyimpan alamat memori dari sebuah variabel (data type atau object dari class). Selain menyimpan alamat dari variabel, pointer juga dapat digunakan untuk menyimpan alamat dari sebuah fungsi (function pointer).  Function pointer telah digunakan sejak dikenalkannya bahasa C, dan banyak digunakan untuk sebuah fungsi callback atau untuk meningkatkan readability dari sebuah code  Anda dapat memperlakukan function pointer seperti pointer biasa (pointer ke datatype/object), anda dapat menyimpan,mengirimkan, merubah address, atau meng- evaluasi address dari pointer ke fungsi ini dengan sifat tambahan anda dapat memanggil fungsi yang ditunjuk oleh function pointer.  Setiap variabel yang dideklarasikan, disimpan dalam sebuah lokasi memori dan pengguna biasanya tidak mengetahui di alamat mana data tersebut disimpan. Dalam C++, untuk mengetahui alamat tempat penyimpanan data, dapat digunakan tanda ampersand (&) yang dapat diartikan “alamat”. Sebenarnya jika programer akan mendeklarasian sebuah variable, seorang programer tidak diharuskan menentukan lokasi sesungguhnya pada memory, karena hal ini akan dilakukan secara otomatis oleh kompiler dan operating sysem pada saat run-time.  Jika ingin mengetahui dimana suatu variable akan disimpan, dapat dilakukan dengan memberikan tanda ampersand (&) didepan variable , yang berarti "address of". Perhatikan contoh dibawah ini:  ted=&andy;  Akan memberikan variable ted alamat dari variable andy, karena variable andy diberi awalan karakter ampersand (&), maka yang menjadi pokok disini adalah alamat dalam memory, bukan isi variable. Misalkan andy diletakkan pada alamat 1776 kemudian dituliskan instruksi sebagai berikut :  andy=25; fred=andy; ted=&andy;  Maka hasilnya adalah sebagai berikut:   andy  25  177517761777   Fred  Ted  25  1776   

Next read halaman 2.
tutorial operasi file halaman 17

tutorial operasi file halaman 17

Selamat datang di eagleboot dan selamat membaca.

lama). Caranya adalah dengan menambahkan perintah ios::app pada open(). nama_obyek.open(“namafile”,ios::app) 

 Program 12.12
 #include<iostream.h> #include<fstream.h> voidmain(){ ofstreamfileteks; fileteks.open("C:/catatan.txt",ios::app); fileteks<<endl; fileteks<<"Oleh:AlKhowarizmi<<endl; fileteks.close(); } 

 12.12.5. Memeriksa File

 Dalam penulisan tidak selamanya jalan yang mulus ditemui. Ada kemungkinan terjadi saat file dibuka, ternyata file tidak ada. Dalam C++ tersedia fungsi untuk memeriksa kondisi-kondisi pada operasi file, sehingga kesalahan saat eksekusi dapat dikendalikan. Fungsi yang dimaksud adalah fail().  
Program 12.13.
 #include<iostream.h> #include<fstream.h> voidmain(){ ifstreamfileteks; { ifstreamdigunakanu/membacafile } fileteks.open("C:/catatan.txt"); if(fileteks.fail())cout<<"Maaffiletakdapatdibuka/"<<"tidakditemukan"; fileteks.close(); }  
Operasi file dapat dilakukan dalam bentuk karakter. Misalnya proses penyimpanan data ke file dilakukan setiap karakter, atau membaca data file karakter per karakter. Operasi ini didukung oleh function put() dan get().

  Program 12.14. Menyimpan data karakter per karakter ke dalam file 
#include<iostream.h> #include<fstream.h> voidmain() { ofstreamfileteks; fileteks.open("C:/contoh.txt"); fileteks.put('A'); fileteks.put('B'); fileteks.put('C'); fileteks.close(); }  

Program 12.15. Program untuk membaca file karakter per karakter
 #include<iostream.h> #include<fstream.h> voidmain() { charkarakter; ifstreamfileteks;{} fileteks.open("C:/contoh.txt"); while(!fileteks.eof()) { fileteks.get(karakter); cout<<karakter; } fileteks.close(); }  

12.17. Soal Latihan 
Jawablah soal latihan dibawah ini dengan baik dan benar. 
 Buktikan bahwa anda telah membacanya. 

1. Apa yang dimaksud dengan file
 2. Apa yang dimaksud dengan kode ascii
 3. Apakah fungsi buffer pada operasi string 
4. Buatlah program untuk menulis file dengan nama latih.txt 
5. Buatlah program untuk menambah data pada file latih.txt
 6. Buatlah program untuk menghapus file latih.txt
 7. Apa yang dimaksud dengan file skuensial.

Next read BAB 13. POINTER 
tutorial operasi file halaman 16

tutorial operasi file halaman 16

Selamat datang di eagleboot dan selamat membaca.

}  b. fgets()danfputs(), Sintaknya dapat diltulis sebagai berikut:

 intfputs(char*str,FILE*fp); char*fgets(char*str,intnum,FILE*fp);  Program 12.8. #include<stdio.h> #include<stdlib.h> voidmain() { FILE*fp; charch[14]; fp=fopen("foo.abc","w");//bukafilefoo.abcuntukditulisi fputs("StringContoh",fp);//menuliskanstring fclose(fp); if((fp=fopen("foo.abc","r"))==NULL){ printf("Errorreadingfile...\n"); exit(1); } puts(fgets(ch,sizeof(ch),fp));//cetakstringdifookelayar fclose(fp); } 

 c. fscanf() dan fprintf() dimana operasi ini mempunyai ciri-ciri sebagai berikut: ? Mirip dengan sintaks scanf() dan  printf() ? Dapat digunakan untuk sembarang file (tidak hanya monitor/layar) ? Dapat menggunakan format data Sintaks adalah sebagai berikut: intfprintf(FILE*fp,constchar*format, …); int fscanf(FILE *fp, const char *format, …); 

 Program 12.9 #include<stdio.h> #include<stdlib.h> voidmain() { FILE*fp; inti; charx[100]; fp=fopen("foo.abc","w");//bukafilefoo.abcuntukditulisi fprintf(fp,"\nSampleCode\n\n");//menuliskansesuatu for(i=1;i<=10;i++){ fprintf(fp,"i=%d\n",i); } fclose(fp); if((fp=fopen("foo.abc","r"))==NULL){ printf("Errormembukafile\n"); exit(1); } while(!feof(fp)){ fscanf(fp,"%s",&x); puts(x); } fclose(fp); } 

 d. fread() dan fwrite() fungsi operasi ini antara lain:  ? Untuk membaca dan menulis blok data (misalnya: Karakter, integer, structure,dan lain-lain) ? Untuk dapat menggunakan fwrite(), file harus dibuka dengan tambahan opsi “b” (binary)  Sintaks:  fwrite(void *buffer, int b_byte, int c, file *fp); fread(void *buffer, int b_byte, int c, file *fp); 
 Keterangan: buffer: pointer ke area di memori yang menampung data yg akan dibaca ke file b_byte: banyaknya byte data yang akan dibaca/tulis (dapat menggunakan sizeof(buffer)) c: banyaknya blok data yang akan dibaca/ditulis fp: pointer ke file  

12.12.2. Menulis File

 Salah satu jenis pemrosesan pada file adalah menulis atau merekam data ke file. Untuk menulis sebuah karakter, bentuk yang digunakan adalah dengan menggunakan Sintak sebagai berikut: putc(intch,file*fp)  dimana  fp adalah pointer file yang dihasilkan oleh fopen()  ch adalah karakter yang akan ditulis.
 Program 12.10
 #include"stdio.h" #include"conio.h" #defineCTRL_Z26 voidmain(){ file*pf;/*pointerkefile*/ charkar; if((pf=fopen("COBA.TXT","w"))==NULL)/*ciptakanfile*/ {cputs("Filetakdapatdiciptakan!\r\n"); exit(1);/*selesai*/ } while((kar=getche())!=CTRL_Z) putc(kar,pf);/*tuliskefile*/ fclose(pf);/*tutupfile*/ } 

 12.12.3. Menutup File 

Setelah pemrosesan file selesai, file dapat ditutup menggunakan perintah  nama_obyek.close();

  Program 12.11.
 Program untuk menulis teks ke dalam file
 #include<iostream.h> #include<fstream.h> voidmain(){ ofstreamfileteks; fileteks.open("C:/Catat.txt"); fileteks<<"Untukmencapaitujuanygbesar,makatujuanitu"<<endl; fileteks<<"harusdibagi‐bagimenjaditujuankecil"<<endl; fileteks<<"sampaitujuanitumerupakantujuanygdapat"<<"dicapai"<<endl; fileteks<<"berdasarkankondisidanpotensiygdimilikisaat"<<"itu"<<endl; fileteks.close(); }  perintah  fileteks.Open(“C:/catat.txt”); 
 akan membuka file catatan.txt yang ada di C:\ . Apabila file tersebut belum ada maka akan dibuat secara otomatis, dan apabila sudah ada isi file catatan.txt akan terhapus.  

12.12.4. Menambah Data File

 Suatu file yang sudah ada sebelumnya dapat ditambah data yang baru (tidak menghapus data)

Next read halaman 17.
tutorial operasi file halaman 15

tutorial operasi file halaman 15

Selamat datang di eagleboot dan selamat membaca.

12.12. Program Operasi FiIe

 Dari uraian operasi file diatas, dibawah ini merupakan beberapa operasi file yang sering dilakukan sehari-hari. Setiap kita bekerja dengan menggunakan komputer kita biasanya melakukan operasi membuka file, menulis file, menambah data file, menghapus file, menutip file dan lain sebagainya. Operasi tersebut dilakukan dengan menggunakan mouse atau keyboard secara langsung Bagaimana jika hal tersebut dilakukan leh program?. Tentunya hal tersebut harus ada instruksi atau perintah-perintah yang digunakan oleh tiap operasi tersebut. Dibawah ini merupakan beberapa operasi file yang dilakukan dengan bahasa C++.

  12.12. 1. Membuka file

 Perintah membuka file dan menghubungkannya dengan stream dengan fopen (library stdio.h) dan menutupnya dengan fclose FILE*fopen(char*nama_file,char *mode) FILE*fclose(FILE*pointer_file)  Dalam membuka file diperlukan mode, dimana hal tersebut  merupakan cara pengaksesan file. Berikut daftar mode yang dapat digunakan:  

Tabel 12.9. Mode operasi file pada C MODEARTI rMembukasebuahfileteksuntukpembacaan wMembuatsebuahfileteksuntukpenulisan aMenambahkandatakesebuahfileteks rbMembukasebuahfilebinaryuntukpembacaan wbMembuatsebuahfilebinaryuntukpenulisan abMenambahkandatakesebuahfilebinary r+Membukasebuahfileteksuntukpembacaan/penulisan w+Membuatsebuahfileteksuntukpembacaan/penulisan a+Menambahkandata/membuatfileteksuntuk pembacaan/penulisan r+bataurb+Membukasebuahfilebinaryuntukpembacaan/penulisan w+batauwb+Membuatsebuahfilebinaryuntukpembacaan/penulisan a+batauab+Menambahkandatakefilebinaryuntuk pembacaan/penulisan 

 Dalam operasi file dilakukan ada beberapa hal yang perlu diperhatikan antara lain: jika operasi open berhasil, fopen() mengembalikan sebuah file pointer yang valid, sedangkan jika operasi gagal, maka fopen() mengembalikan sebuah null pointer, sehingga harus selalu dicek pada saat pembukaan file. Perhatikan program dibawah ini: FILE*fp; if((fp=fopen("fileku.txt","r")==NULL){ cout<<"Errordalampembukaan file\n"; exit(1); } fclose(fp);//menutup streamfile  Dibawah ini merupakan fungsi untuk operasi file teks antara lain  a. fgetc()danfputc(),dimanaSintaknyadapatditulis: intfgetc(FILE*fp); intfputc(intch,FILE*fp); 

 Program 12.7
 include<stdio.h> #include<stdlib.h> usingnamespacestd; intmain() { FILE*fp; inti; intch; fp=fopen("foo.abc","w");//bukafilefoo.abcuntukditulisi for(i=0;i<10;i++){//loopuntukmeletakkankarakter2 fputc('A',fp);//menuliskankarakterA fputc('\n',fp);//menuliskanpergantianbaris } fclose(fp); if((fp=fopen("foo.abc","r"))==NULL){ cout<<"Errorreadingfile...\n"; exit(1); } while(ch!=EOF){//bacafilesampaitandaEOF(EndofFile) ch=fgetc(fp);//ambilsatukarakter putchar(ch);//menampilkankarakterkelayar } fclose(fp); 

Next read halaman 16.
tutorial operasi file halaman 14

tutorial operasi file halaman 14

Selamat datang di eagleboot dan selamat membaca.

ch=fgetc(in_file); if(ch==EOF) break; ++count; } cout<<"jumlahkarakter"<<FILE_NAME<<"adalah"<<count<<'\n'; fclose(in_file); return(0); }

 12.11.  File sekuensial

 Sequential file (Arsip sekuensial) adalah sekumpulan rekaman yang disimpan dalam media penyimpanan sekunder komputer, yang dapat diakses secara sekuensial mulai dari rekaman pertama sampai dengan rekaman yang terakhir, rekaman per rekaman secara searah. File sekuensial berisi rekord-rekord data yang tidak mengenal posisi baris atau nomor rekord pada saat aksesnya, dan setiap record dapat mempunyai lebar yang berbeda-beda.  Akses terhadapnya selalu dimulai dari awal file dan berjalan satu persatu menuju akhir dari file. Dengan demikian, penambahan file hanya dapat dilakukan terhadap akhir file, dan akses terhadap baris tertentu harus dimulai dari awal file.  Fungsi baku yang terkait dengan file sekuensial ini antara lain adalah fprintf, fscanf, dan rewind . Program berikut menyajikan penanganan file sekuensial tentang data nasabah yang berisi tiga field, yaitu nomor identitas (account), nama (name), dan posisi tabungannya (balance) untuk (1) menyajikan yang tabungannya bernilai nol, (2) berstatus kredit, dan (3) berstatus debet. Misalny sebuah file data tersimpan dengan nama klien.dat. Rekaman terakhir adalah rekaman fiktif, yang menandai akhir dari arsip. Pada beberapa implementasi, rekaman fiktif ini disebut sebagai EOF (End Of File). Arsip sekuensial berasal dari hasil perekaman (penulisan) yang juga dilakukan rekaman per rekaman. Setiap rekaman boleh berisi type dasar ataupun type terstruktur yang telah didefinisikan, setiap rekaman strukturnya sama.  Elemen dari rekaman disebut sebagai "field", ada field (atau juga sekumpulan field) rekaman yang disebut sebagai "key" karena kekhususannya dalam proses. Jika key dari setiap rekaman tidak ada yang sama (unik), maka key menjadi identitas rekaman, dan disebut "primary key". Setiap rekaman dapat diakses dan dikonsultasi (dibaca) menurut urutannya dengan pemanggilan primitif akses yang tersedia. Perekaman dapat dilakukan melalui primitif penulisan.  Perhatikan bahwa suatu arsip sekuensial hanya dapat disiapkan hanya pada salah satu modus operasi: diakses/dibaca, atau ditulis. Dalam definisi arsip sekuensial, tidak pernah sebuah arsip diproses untuk kedua modus: dibaca dan sekaligus ditulis. Primitif-primitif tsb, akan didefinisikan kemudian.


Program 12.6 #include<stdio.h> usingnamespacestd; voidmain(){ intrequest,account; floatbalance; charname[25]; FILE*cfPtr; if((cfPtr=fopen("klien.dat","r+"))==NULL) printf("Filecouldnotbeopened\n"); else{ printf("Enterrequest\n" "1‐Listaccountswithzerobalances\n" "2‐Listaccountswithcreditbalances\n" "3‐Listaccountswithdebitbalances\n" "4‐Endofrun\n?"); scanf("%d",&request); while(request!=4){ fscanf(cfPtr,"%d%s%f",&account,name,&balance); switch(request){ case1: printf("\nAccountswithzerobalances:\n"); while(!feof(cfPtr)){ if(balance==0) printf("%‐10d%‐13s7.2f\n",account,name,balance); fscanf(cfPtr,"%d%s%f",&account,name,&balance); } break; case2: printf("\nAccountswithcreditbalances:\n"); while(!feof(cfPtr)){ if(balance<0) printf("%‐10d%‐13s7.2f\n",account,name,balance); fscanf(cfPtr,"%d%s%f",&account,name,&balance); } break; case3: printf("\nAccountswithdebitbalances:\n"); while(!feof(cfPtr)){ if(balance>0) printf("%‐10d%‐13s7.2f\n",account,name,balance); fscanf(cfPtr,"%d%s%f",&account,name,&balance); } break; } rewind(cfPtr); printf("\n?"); scanf("%d",&request); } printf("Endofrun.\n"); fclose(cfPtr); } }

Next read halaman 15.
tutorial operasi file halaman 13

tutorial operasi file halaman 13

Selamat datang di eagleboot dan selamat membaca.

Langkah pertama harus membuat semua ukuran buffer didefinisikan sebagai nilai konstan, sehingga hal tersebut sangat mudah dimodifikasi, biasanya cukup mudah diingat yaitu misalnya jika ulkurannya 16K maka programmer dapat menggunakan dengan menuliskan  16 * 1024. Atau bentuk konstannya dapat ditulis seperti sebelumnya yaitu 16K.  Jika pengguna menggunakan program yang tidak sesuai, akan muncul pesan bahsa hasil atau program mengalami kesalahan. Untuk menolongnya atau membetulkannya maka sebuah pesan akan muncul bagaimana menggunakan program yang betul. Suatu ketika programmer dimungkinkan tidak mengetahui bahwa buffer telah penuh, sehingga perlu ditambahkan  read_size yang digunakan untuk menentukan jumlah byte yang akan ditulis  12.10.  Rutin-Rutin pada C++ C++ mengizinkan anda untuk menggunakan library I/O pada C didalam program C++. Hal ini terjadi banyak kali terjadi karena seseorang membutuhkan suatu program C, menterjemahkannya kepada C++, dan tidak ingin mengganggu pemanggilan I/O. Dalam beberapa hal, library bahasa C yang lama bisa lebih baik dan lebih mudah digunakan dibandingkan dengan yang baru dalam hal ini C++.  Sebagai contoh, rutin-rutin string pada C seperti  sscanf dan  sprintf menggunakan suatu jauh lebih kompak dalam sistim pengaturannya dibanding C++. Deklarasi-deklarasi pada struktur dan fungsi yang digunakan oleh fungsi C I/O disimpan di dalam standar file include <cstdio>. FILE*file_variable;/*Comment*/  sebagai contoh: #include<cstdio> FILE*in_file;/* File berisi data masukandata*/

  Sebelum suatu file dapat digunakan, yang harus dibuka dengan fungsi adalah  fopen.  fopen kembali pada sebuah pointer ke file struktur. Format untuk  fopen adalah: file_variable=fopen(name,mode);  dimana file_variablenya adalah: name adalah sebuah nama yang digunakan oleh sebuah file seperti ("data.txt", "temp.dat", dan lain-lain). Mode merupakan sebagai indikasi apakah file akan dibaca atau ditulis. Mode adalah dengan tanda “w” adalah untuk menulis atau “r”  untuk membaca. Fungsi  fclose untuk menutup file, dimana format  fclose adalah: status=fclose(file_variable);  variabel status akan menjadi no jika  fclose telah sukses atau bukan nol (nonzero) jika mengalami kesalahan. C menyediakan tiga  three langkah sebelum membuka sebuah file. Hal ini dapat dilihat pada daftar dibawah ini:  

Table 12.8. File Standard
 FILE DESCRIPTION stdinStandarmasukan(membukauntukdibaca). PadabahasaC++ekivalendengancin. stdoutStandardkeluaran(membukauntukditulis). PadabahasaC++ekivalendengancout. stderrStandardsalah(membukauntukditulis). PadabahasaC++ekivalalendengancerr. (dalam bahasa C tidak ada sedangkan dalam bahasa C++ ekivalendenganclog.  Fungsi  fgetc akan membaca sebuah karakter dari suatu file. Jika tidak ada lebih banyak data di dalam file, fungsi kembali secara konstan ke EOF (EOF dideskkripsikan pada cstdio). Yang perlu dicatat bahwa  fgetc kembalikan satu bilangan bulat, bukan suatu karakter. Ini diperlukan karena EOF flag harus mempunyai nilai bukan karakter. 

Program 12.5.
 #include<cstdio> #include<cstdlib>/*FilestandarANSIC*/ #include<iostream> usingnamespacestd; constcharFILE_NAME[]="input.txt";//namafilemasukan intmain() { intcount=0;//jumlahkarakter FILE*in_file;//masukanfile intch;//karakteratauEOFflagdarimasukan in_file=fopen(FILE_NAME,"rb"); if(in_file==NULL){ cerr<<"tidakbisamembukaFile"<<FILE_NAME<<'\n'; exit(8); } while(true){

Next read halaman 14.
tutorial operasi file halaman 12

tutorial operasi file halaman 12

Selamat datang di eagleboot dan selamat membaca.

Kecil dibandingkan dengannya. Format pemanggilan penulisan adalah sebagai berikut:  write_size=write(file_descriptor,buffer, size);  pada sintaks diatas, write_size merupakan jumlah byte data actual yang ditulis, bilangan negative menunjukan adanya kesalahan. File descriptor adalah file yang meneskripsikan saat sebuah file dibuka.  Buffer adalah sebuah pointer dimanadata ditulis. Size adalah ukuran data yang ditulis. Sebuah system akan dicoba untuk ditulisnya dalam jumlah besar, tetapi jika piranti telah penuh ata disana ada beberapa masalah, sejumlah bilangan dari byte mungkin akan ditulis. Terakhir adalah melakukan penutupan file dimana sintaknya adalah sebagai berikut: flag=close(file_descriptor)  pada sintaks tersebut diatas terdapat flag yang digunakan untuk menandai bahwa ketika data 0 untuk menandai bahwa penutupan berhasil sedangkan, bilangan negative ketika mengalami kegagalan atau error. File descriptor untuk mendeskripsikan saat file dibuka. Program dibawah ini merupakan pencopyan file. Operasi ini mengunakan I/O tanpa buffer karena program tersebut membutuhkan buffer yang besar. Program dibuat tidak menggunakan I/O buffer untuk membaca 1 KB data dan kemudian dipindahkan menuju buffer dengan menggunakan  ifstream dikirim menuju buffer 16KB.  

Program 12.4.
 #include<conio.h> #include<iostream> #include<cstdlib> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> usingnamespacestd; #ifdef__WIN32__ //jikakitamenggunakanWindows32 #include<io.h> //includefilei/obekerjapadaWindows32 #else/*__WIN32__*/ #include<unistd.h> //includefilei/obekerjapadaunix #endif/*__WIN32__*/ constintBUFFER_SIZE=(16*1024);//menggunakanbuffer16k intmain(intargc,char*argv[]) { charbuffer[BUFFER_SIZE];//bufferdata intin_file;//inputfiledescriptor intout_file; //outputfiledescriptor intread_size; //numberofbytesonlastread if(argc!=3){ cerr<<"Error:Angkasebagaiarugmensalah\n"; cerr<<"penggunaanyaadalah:copy<from><to>\n"; exit(8); } in_file=open(argv[1],O_RDONLY); if(in_file<0){ cerr<<"Error:tidakbisadibuka"<<argv[1]<<'\n'; exit(8); } out_file=open(argv[2],O_WRONLY|O_TRUNC|O_CREAT,0666); if(out_file<0){ cerr<<"Error:Tidakbisadibuka"<<argv[2]<<'\n'; exit(8); } while(true){ read_size=read(in_file,buffer,sizeof(buffer)); if(read_size==0) break;//akhirfile if(read_size<0){ cerr<<"Error:kesalahanbaca\n"; exit(8); } write(out_file,buffer,(unsignedint)read_size); } close(in_file); close(out_file); getch(); return(0); } 



Next read halaman 13.
tutorial operasi file halaman 11

tutorial operasi file halaman 11

Selamat datang di eagleboot dan selamat membaca.

buffer dapat meminimalkan panggilan-panggilan yang dilakukan.  I/O tanpa buffer biasanya digunakan ketika hanya membaca atau menulis data biner dalam  jumlah besar ketika kendali langsung dari piranti atau sebuah file dibutuhkan. Kembali pada penjepit kertas seperti dicontohkan diatas, jika seseorang menggambil benda kecil seperti penjepit tersebut, tentunya oran tersebut tidak akan menemui kesulitan menggunakan tangan kiri sebagai penahan/penampung sementara. Tetapi jika seseorang menambil bola meriam yam mana bendanya lebih besar ddibandingkan penampungnya maka kasus seperti ini tidak menggunakan buffer. Sebuah open system, pemanggilan digunakan untuk membuka file tanpa buffer. Sebuah definisi makro digunakan dengan cara memanggil dari system yang berbeda. Sebagai contoh bekerja pada dua system yang berbeda seperti pada system operasi UNIX dan MS-DOS/windows. Dalam kasus tersebut maka sebuah kondisi compilasi (#ifdef/#endif) digunakan untuk memperbaiki file tersebut seperti contoh program dibawah ini:

 #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #ifdef__MSDOS__//jikabekerjapadaMS‐DOS #include<io.h>//memanggilincludefilei/opadaMS‐DOS #else/*__MSDOS__*/ #include<unistd.h> //memanggilincludefilei/opadaUNIX #endif/*__MSDOS__*/  Sebuah perintah atau sintak untuk membuka akan memanggil: intfile_descriptor=open(name,flags);//fileyangsudahada file_descriptor=open(name,flags,mode);//filebaru  

dimana, file_descriptor merupakan integer yang digunakan untuk mengidentifikasikan file untuk dibaca, ditulis atau ditutup pemanggilannya. Jika file_descriptor kurang dari 0 berarti kesalahan telah terjadi. Name merupakan nama file. Flag merupakan definisi dalam file header fcntl.h, dimana flag tersebut dijelaskan dalam table dibawah. Sedangkan mode adalah mode proteksi file dimana mode ini biasanya 0644. 

Tabel 12.6. Open flag 
FLAG ARTI O_RDONLYOpenforreadingonly. O_WRONLY Openforwritingonly. O_RDWROpenforreadingandwriting. O_APPENDAppendnewdataattheendofthefile. O_CREATCreate file (the file mode parameter required when this flag is present). O_TRUNCIfthefileexists,truncateitto0length. O_EXCLFailiffileexists. O_BINARYOpeninbinarymode(olderUnixsystemsmaynothavethisflag).  

Sebagai contoh pada saat operasi membuka file dengan nama file data.txt dalam mode pembacaan text, maka potongan program yang dituliskan adalah sebagai berikut:
 data_fd=open("data.txt",O_RDONLY);  
selain contoh diatas, bagaimana untuk membuat sebuah file output.dat dapat ditulis, maka potongan program adalah sebagai berikut:
 out_fd=open("output.dat", O_CREAT|O_WRONLY,0666); 

 Pada sintak tersebut diatas menggunakan operator OR ( | ) yang artinya merupakan pengabungan flag yang melebihi dari satu, untuk mempermudah dan mempercepat penulisan ketika beberapa program telah berjalan pada awal, dan tiga file sudah terbuka, dimana hal tersebut dapat dideskrisikan pada table dibawah ini: 

 Tabel 12.7. Standar file tidak terbuffer
 NOMOR FILE PENJELASAN 0Standardin 1Standardout 2Standarderror  Format dari pemanggilan read adalah:
 read_size = read(file_descriptor, buffer, size);  

dimana: read_size, merupakan jumlah actual dari byte yang dibaca, 0 mengindikasikan akhir file dan bilangan negative mengindikasikan adanya kesalahan dalam file.  File_descriptor, merupakan sebuah file yang mendeskripsikan dari file yang dibuka, buffer merupakan sebuah pointer untuk menempatkan  dan meletakan data yang dibaca dari file. Size merupakan ukuran data yang dibaca. Hal ini merupakan ukuran dari file yang diminta. Pada jumlah sebenarnya dari byte yang dibaca mungkin lebih.

Next read halaman 12.
tutorial operasi file halaman 10

tutorial operasi file halaman 10

Selamat datang di eagleboot dan selamat membaca.

dalam kapasitas data besar atau sampai sebuah buffer disegarkan kembali. Sebuah program yang mengikuti dirancang untuk dicetak pesan cepat sampai setiap bagian terselesaikan. Perhatikan potongan program dibawah ini:

 cout<<"mulai"; do_step_1(); cout<<"langkah1complete"; do_step_2(); cout<<"langkah2complete"; do_step_3(); cout<<"langkah3complete\n";

  sebagai ganti dari menulis sebuah pesan sampai pada tiap langkah selesai,  cout pesan tersebut diletakan dalam sebuah buffer. Hanya setelah program selesai maka selanjutnya buffer memperleh penyegaran atau pengosongan dan semua pesan yang datang ditumpahkan keluar dengan seketika. Sebuah manipulator I/O  flush akan menyegarkan buffer-buffer tersebut. Sifat yang ditulis diatas diberikan contoh seperti pada program dibawah ini:

 cout<<"mulai"<<flush; do_step_1(); cout<<"Langkah1complete"<<flush; do_step_2(); cout<<"langkah2complete"<<flush; do_step_3(); cout<<"langkah3complete\n"<< flush;  

karena tiap pernyataan keluaran berakhir dengan  flush, sebuah keluaran akan ditampilkan secara langsung. Ini artinya bahwa penyelesaian pesan akan datang sesuai dengan waktunya. Dalam I/O buffer, data ditahan dan kemudian dikirim dalam bentuk file, sedangkan dalam I/O tidak terbuffer data secara langsung dikirim dalam bentuk file. Analogi ini disampaikan dalam bentuk kejadian di lingkunang kita pada sejumlah penjepit kertas yang jatuh kelantai seseorang dapat mengambilnya dalam mode buffer atau tanpa buffer. Dengan mode buffer jika anda menggunakan tangan kanan untuk mengambil penjepit kertas dan kemudian memindahkan penjepit ke tangan kiri. Proses tersebut diulang- ulang sampai pada tangan kiri penuh kemudian penjepit tersebut dipindahkan ke dalam kotak yang ada diatas meja. Dengan buffer I/O akan ada media sementara yang digunakan untuk menampung sebelum dipindahkan ke media yang utama dan lebih besar. Dalam mode tanpa buffer, dapat dianalogikan seperti anda mengambil sejumlah penjepit kertas yang jatuh dilantai dan langsung memasukan kedalam kotak yang berada diatas meja. Pekerjaan ini dilakukan dengan tangan kanan tanpa menggunakan tangan kiri sebagai penampung sementara.  Dalam kebanyakan kasus, I/O dengan buffer sering digunakan daripada tanpa buffer. Dalam I/O tanpa buffer tiap pembacaan dan penulisan membutuhkan pemanggilan system. Beberapa pemanggilan pada sisem operasi sangat mahal dan membutuhkan waktu yang banyak, sehingga dengan I/O yang menggunakan 

Next read halaman 11.
tutorial operasi file halaman 9

tutorial operasi file halaman 9

Selamat datang di eagleboot dan selamat membaca.

12.8.  Binary I/O

 Input atau output file biner dapat diselesaikan melalui dua fungsi keanggotaan yaitu: read and write. Penulisan atau sintak untuk membaca adalah: 
 in_file.read(data_ptr,size); 
 dimana data_ptr merupakan pointer sebagai tempat untuk meletakan data dan size merupakan angka dalam ukuran byte yang akan dibaca.  Fungsi keanggotaan qcount akan mengembalikan sejumlah byte data yang telah dibaca pada akhir. Hal ini dimungkinkan akan berkurang diandingkan dengan jumlah byte yang diminta. Sebagai contoh pembacaan yang mungkin ditemui pada akhir file atau ditemukan adanya kesalahan.

  struct{ intwidth; intheight; }rectangle; in_file.read(static_cast<char*>(&rectangle),sizeof(rectangle)); if(in_file.bad()){ cerr<<"Tidakdimungkinkanmembacarectangle\n"; exit(8); } if(in_file.gcount()!=sizeof(rectangle)){ cerr<<"Error:tidakbisauntukmembaca\n"; cerr<<"I/Omengalamierror,EOFtidakbisadihitung\n"; }  

Dalam contoh program diatas ketika sedang membaca sebuah struktur persegi panjang. Sebuah operator & akan membuat persegi panjang tersebut manuju sebuah pointer.  Kemudian sebuah sintak  static_cast<char *> dibutuhkan setelah read menginginkan sebuah deretan array. Sebuah operator sizeof  digunakan untuk menentukan berapa banyak byte yang dibaca sebaik pengecekan tersebut sampai operasi  tersebut menjadi berhasil. Sebuah keanggotaan fungsi write telah memanggil secara sekuensial sama dengan operasi read adalah dengan sintak: out_file.write(data_ptr,size);

 12.9.  Buffer

 Buffer atau sering kita artikan sebagai penahan atau penyangga suatu memori sebuah data. Penyangga sebuah I/O tidak bisa ditulis secara langsung pada sebuah file. Sebuah data akan dijaga keberadaanya dalam sebuah buffer sampai disana cukup untuk menulis.

Next read halaman 10.
tutorial operasi file halaman 8

tutorial operasi file halaman 8

Selamat datang di eagleboot dan selamat membaca.

File Binary dan ASCII 

 American Standard Code for Information Interchange (ASCII) merupakan kode yang terdiri dari 95 kode karakter dan 33 kode kendali (lihat lampiran 1). Dengan kode ASCII memungkinkan manusia pengguna komputer dapat mengerti karena ACSII merupakan pengkodean yang mengacu pada bahasa manusia.  Misalnya ketika programer menulis file dengan nama prog.cc secara otomatis file tersebut berupa kode ASCII. Sebuah terminal seperti keyboard, printer berhubungan dengan data karakter. Ketika sesorang menulis angka seperti 1234 yang kemudian muncul pada layar monitor, angka tersebut harus dikonversi menjadi empat karakter (“1”, “2”, “3”, dan “4”) . Hal yang sama juga ketika seseorang membaca angka dari keyboard, sebuah data harus dikonversi dari data karakter menjadi data integer. Hal ini dikerjakan oleh operator >>. Karater ASCII “0” mempunyai nilai 48, “1” mempunyai nilai 49 dan seterusnya seperti terlihat pada lampiran kode ASCII. Ketika sesorang akan mengubah digit tunggal dari kode ASCII menjadi integer akan sama halnya anda mengubah menjadi data 48. Perhatikan program dibawah ini: 

intinteger; charch; ch='5'; integer=ch‐48; cout<<"Integer"<<integer<<'\n';  

Daripada mengingat karakter “0” yang lebih sulit dingat dengan 48, lebih baik mengkonversi menjadi karakter ‘0’. Perhatikan program dibawah ini: 
 integer=ch‐'0';
 komputer bekerja dengan data biner. Ketika komputer membaca dari file ASCII, program pada komputer memproses data karakter melalui routine konversi seperti routine konversi integer yang telah didefinisikan. Operasi ini akan menjadi lebih mahal dikarenakan membutuhkan ruang memori dan waktu. Sebuah file biner tidak membutuhkan konversi. File-file tersebut umumnya memakai ruang yang kecil dibandingkan file kode ASCII. Kelemahan pada file biner adalah tidak bisa dicetak secara langsung pada terminal atau printer. Jika file biner dicetak pada printer secara langsung tanpa adanya konversi yang terjadi adalah data cetak tidak sesuai seperti terlihat
 “#@$%@^Aa^AA^^JHC%^X". 
Tentunya apa yang akan terjadi jika dicoba mencetak file biner.  File ASCII marupakan file portbel karena banyak dipakai. File ini dapat dipindah dari satu mesin ke mesin yang lain dengan sedikit kesalahan.  File biner bisa dikatakan pasti tidak portabel. File mana yang harus digunakan? Dalam beberapa kasus ASCII sangat baik.  Alasan ini dikemukakan jika mempunyai data dengan jumlah kecil atau medium waktu konversi tidak begitu mempengaruhi unjuk kerja program yang telah dibuat. Selain itu file ASCII juga membuat dalam melakukan verifikasi data. Hanya ketika menggunakan sejumlah data yang besar saja akan memakan ruang dan mempengaruhi unjuk kerja sehingga diperlukan data dalam format biner.

Next read halaman 9.
tutorial operasi file halaman 7

tutorial operasi file halaman 7

Selamat datang di eagleboot dan selamat membaca.

program diatas digunakan untuk menentukan karakter, dimana karakter digunakan sebagai  penambah angka ketika angka terlalu kecil.  Fungsi-fungsi tersebut dapat disebut dengan pengarah, atau programer dapat menggunakan I/O manipulator.  Sebuah I/O manipulator adalah sebuah fungsi khusus yang digunakan dalam pernyataan I/O untuk mengubah format. Jika dipikirkan sebuah manipulator dapat dianalogikan seperti halnya peluru ajaib, dimana ketika ditembakan melalui/masuk atau setelah keluar dari sebuah file, akan mengubah kondisi sebuah file tersebut. Manipulator tidak menyebabkan beberapa keluaran tetapi hanya mengubah kondisinya saja.  Sebagai contoh pada manipulator hex hanya melakukan konversi keluaran menjadi hexadesimal
 #include<iostream> number=0x3FF; cout<<"Numberis"<<hex<<number <<dec<<'\n';  
sebuah file header <iostream> mendefinisikan kumpulan dasar dari sebuah menipulator yang dapat dilihat pada tabel dibawah ini:

  Tabel 12.4. I/O manipulator
 MANIPULATOR ::DESKRIPSI decKeluaranangkadalamformatdesimal. hexKeluaranangkadalamformathexadesimal. octKeluaranangkadalamformatoktal. wsLoncatispacepadamasukan. endlKeluaranpadaend‐of‐line endsKeluaranpadaend‐of‐string(`\0'). flushLakukanpembufferankeluaranout.

  Selain tebal diatas ada juga manipulator yang didefinisikan ole file header <iomanip> dapat dilihat pada tabel dibawah ini:  

Tabel 12.5. Fungsi I/O manipulator pada C
 MANIPULATOR ::DESKRIPSI setiosflags(longflags)Aturpemilihflagkonversi. resetiosflags(longflags)Resetflagterpilih. setbase(intbase)Aturkonersidasarmenuju8,10,atau16.Urutkan secaraumumdec,hex,oct. setw(intwidth)Aturlebarkeluaran. setprecision(intprecision)Aturpresisidarikeluaranfloating‐point. setfill(charch)Aturkarakteryangdiblok/ditandai. 

Untuk lebih jelasnya perhatikan penggunaan I/O manipulator pada program dibawah ini. 

 program 12.3
 #include<conio.h> #include<iostream> #include<iomanip> usingnamespacestd; intmain() { intnumber=12;//angkauntukkeluarkan floatreal=12.34;//angkayangnyata cout<<"123456789012345678901234567890\n";//rulerkeluaran cout<<number<<"<‐\n"; cout<<setw(5)<<number<<"<‐\n"; cout<<setw(5)<<setfill('*')<<number<<"<‐\n"; cout<<setiosflags(ios::showpos|ios::left)<<setw(5)<<number<<"<‐\n"; cout<<real<<"<‐\n"; cout<<setprecision(1)<<setiosflags(ios::fixed)<<real<<"<‐\n"; cout<<setiosflags(ios::scientific)<<real<<"<‐\n"; getch(); return(0); }  

Keluaran dari program diatas setelah di compile adalah: 123456789012345678901234567890 12<‐ 12<‐ ***12<‐ +12**<‐ 12.34<‐ 12.3<‐ 1e+01<‐

Next read halaman 8.
tutorial operasi file halaman 6

tutorial operasi file halaman 6

Selamat datang di eagleboot dan selamat membaca.

Program 12.2. #include<iostream> #include<fstream> usingnamespacestd; voidlog_message(conststring&msg) { ofstreamout_file("data.log", if(out_file.bad()) out_file<<msg<<endl; return; }  

12.6.  Routin-routin Konversi File 

Untuk menulis angka pada printer atau sebuah terminal, programer harus mengkonversi angka ke karakter. Sebuah printer hanya bisa mengerti karakter bukan angka. Sebagai contoh 567 harus dikonversi menjadi tig karake yaitu: “5”, ”6”, dan “7” dan kemudian dicetak.  Operator << digunakan untuk mengkonversi data menuju karakter dan meletakanya dalam sebuah file. Fungsi ini adalah sangat flexibel. Hal tersebut mengubah integer sederhana menjadi variabel tetap atau yang sesuai dengan stering dalam bentuk bilangan hexadesimal, oktal atau desimal dengan penulisan rata pada margin kiri atau kanan. Jika selama menulis program tidak melakukan pengaturan apapun maka hasil konversi dalam kondisi default.  Keanggotan fungsi setf dan unsetf digunakan untuk mengatur kondisi flag menjadi berlogika set “1" atau clear “0” dimana hal ini digunakan kendali proses konversi. Secara umum bentu penulisan fungsi adalah sebagai berikut:
 file_var.setf(flags);//Setflags file_var.unsetf(flags);//Clearflags 

 Tabel dibawah ini merupakan daftar flag dan penjelasnya.  
Tabel 12.3. I/O konversi flag
 FLAG ARTI ios::skipwsloncatikarakteryangmendahuluispasisebagaimasukan. ios::leftOutputsebelahkiridibenarkan. ios::rightOutputseblahkanandibenarkan. ios::internalNumerikkeluaranadalahmemasukkanpaddedolehkarakter yangmengisiantaratandaataudasarkarakterdanjumlahitu sendiri. 
ios::boolalphaGunakanversikarakteryangbenardansalahuntukinputdan output. ios::decOutputdalamdasarangka10,formatdesimal. ios::octKeluaranangkadenganformat8angkaoktal. ios::hexOutputdalamformatangka16,heksadesimal. ios::showbaseMencetak indikator inti pada setiap awal nomor. Misalnya, angkaheksadesimalyangdiawalidengan"0x". ios::showpointMenunjukkan titik desimal untuk semua angka floating‐point apakahiadibutuhkan. ios::uppercaseKetika konversi heksadesimal angka, menunjukkan angka AF sebagaihurufbesar. ios::showposMenempatkantandapositifsebelumsemuanomor. ios::scientificMengkonversisemuaangkafloating‐pointuntuknotasiilmiah padaoutput. ios::fixedMengkonversisemuafloating‐pointnomorketitiktetappada output. ios::unitbufBufferoutput. 

 Jika pada saat mnulis program menginginkan keluaran berupa format bilangan hexadesimal, maka yang harus dikerjakan adalah menambah dengan menulis  potongan program dibawah ini: 
number=0x3FF; cout<<"Dec:"<<number<<'\n'; cout.setf(ios::hex); cout<<"Hex:"<<number<<'\n'; cout.setf(ios::dec);  
ketika di”run”, maka pprogram akan menghasilkan keluaran sebagai berikut: Dec:1023 Hex:3ff  Ketika konversi angka ke karakter dilakukan, maka fungsi keanggotaannya ditulis: intfile_var.width(intsize); suatu saat output harus ditentukan sesuai dengan jumlah karakter yang digunakan. Sebagai contoh misalnya sejumlah 3 angka, secara umum dikonversi menjadi karakter string “3”. Jika diatur sampai empat, maka hasilnya menjadi  dimana  menunjukan satu ruang karakter. Perhatikan fungsi dibawah ini: intfile_var.precision(intdigits);
  pernyataan program diatas digunakan untuk mengatur berapa banyak angkat yang akan dimunculkan setelah tanda koma (,). Dan kemudian menuliskan fungsi seperti dibawah ini:
 charfile_var.fill(charpad);

Next read halaman 7.
tutorial operasi file halaman 5

tutorial operasi file halaman 5

Selamat datang di eagleboot dan selamat membaca.

akhir. Jika tidak dikehendaki maka programer bisa menggunakan pengaturan default untuk menuju baris baru (‘\n’)  

12.5. Pembacaan String

 Untuk membaca gaya bahasa string pada C, dapat menggunakan fungsi getline. Fungsi ini dapat didefinisikan sebagai berikut:
istream& getline(char *buffer, int len, chardelim='\n') 
dimana parameter-parameter pada fungsi ini antara lain: 1. Buffer, gaya bahasa string, dimana string disimpan setelah dilakukan pembacaan 2. Len, panjang buffer yang digunakan dalam byte. Fungsi ini akan membaca sampai len-1 byte data menuju buffer. Parameter ini biasanya disebut dengan sizeof(buffer) 3. Delim, yaitu karakter yang digunakan. Fungsi ini akan mengembalikan referensi menjadi file masukan. Kemudian fungsi ini akan membaca terus-menerus sampai ditemukan tanda karakter akhir baris (‘\n’). karakter tanda akhir baris ini tidak disimpan dalam buffer, yang disimpan sebagai akhir string adalah jika ditemukan tanda bahwa string telah berakhir (‘\0’). Perhatikan contoh dibawah ini:
 charbuffer[30]; cin.getline(buffer,sizeof(buffer)); 
Fungsi untuk file keluaran adalah sama dengan file masukan, sebagai contoh pada deklarasi dibawah ini:
 ofstreamout_file("out.dat"); 
 deklarasi diatas merupakan membuat/menulis file dengan nama out.dat dan dalam penulisan nama juga diperbolehkan mnulis dengan nama seperti out_file. Pada kenyataanya, construktor dapat mengambil dua argumen tambahan. Definisi penuh dari file keluaran construktor adalah:
 ofstream::ofstream(const char *name, intmode=ios::out, intprot=filebuf::openprot); 
 dimana parameter-parameter pada fungsi ini adalah:  Name, nama dari nama file yang ditulis  Mode, merupakan sekumpulan flag/tanda O merah bersama- sama bahwa hal tersebut merupakan mode open. Flag  ios::out dibutuhkan sebagai file keluaran.  Flag-flag lain yang dibutuhkan seperti dalam tabel dibawah ini. 
Tabel 12.2.Open Flag 
FLAG ARTI ios::appmenambahkandatakeakhiroutputfile. ios::atePergikeakhirfileketikadibuka. ios::inMembukauntukmasukan(harusdiberikankepadafungsibuka ifstreamvariabel). ios::outBukafileuntukoutput(harusdiberikankepadafungsianggota bukaofstreamvariabel). ios::binaryFilebinary(jikatidakada,makafiledibukasebagaifileASCII). ios::truncMembuangisiyangadasaatmembukafileuntukmenulis. ios::nocreateMengalamigagaljikafiletersebuttidakada.(Outputfilesaja. Membukasebuahfileinputselalugagaljikatidakadafile.). ios::noreplaceJangan menimpa file yang ada. Jika file ada, menyebabkan rusakketikabuka.  

 Prot, file protection dimana hal ini tergantung pada sistem operasi yang digunakan untuk menentukan mode proteksi file tersebut. Misalnya pada UNIX proteksi default sampai 0644 untuk baca/tulis sendiri, baca pada group maupun penulisan lainnya, sedangkan MS-DOS/windows defaultnya adalah 0 dalam kondisi file normal. Perhatikan contoh pernyataan dibawah ini: 
 ofstreamout_file("data.new", ios::out|ios::binary|ios::nocreate| ios::app);  

potongan pogram diatas dapat diartikan digunakan menambahkan (ios::app) data biner menggunakan (ios::binary), kalau file sudah ada atau telah ditemukan filenya (ios::nocreate) sedangkan data.new merupakan nama file yang akan ditulis. Pada contoh dibawah terdiri dari fungsi pendek tersebut digunakan untuk menulis pesan pada sebuah file catatan. Sesuatu yang pertama yang dilakukan adalah membuka fungsi untuk operasi output (ios::out), menambahkan catatan (ios::app), dengan menulis dari permulaan sampai akhir penulisan (ios::ate). Setelah fungsi tersebut menulis pesan serta terahir menutup file. Fungsi ini telah dirancang dengan sederhana, dimana hal tersebut juga tidak memperdulikan mengenai efisiensi dan sebagai hasil dari fungsi adalah sangat tidak efisien. Masalah tersebut dibuka dan ditutup setiap saat memanggil log_message. Membuka file merupakan sebuah operasi yang cukup mahal, dan sesuatu juga harus mempunyai kecepatan lebih tinggi, jika akan membuka file hanya sekali dan mengingatkan tersebut.

Next read halaman 6.
tutorial operasi file halaman 4

tutorial operasi file halaman 4

Selamat datang di eagleboot dan selamat membaca.

kemudian yang dibutuhkan adalah C++ mengambil file pada hardisk yang digunakan. Hal ini dikerjakan melalui dengan membuka fungsi keanggotaan sebagai berikut: data_file.open("angka.dat");  sekarang programmer dpat membaca file mengunakan statement yang sama untuk membaca yaitu dengan  cin. Perhatikan program dibawah ini: 

for(i=0;i<100;++i){ assert(i>=0); assert(i<sizeof(data_array) /sizeof(data_array[0])); data_file>>data_array[i]; } 
 Terakhir yang dibutuhkan untuk mengetahui bahwa sistem I/O telah mengerjakannya dan kemudian menuliskan sebagai berikut: data_file.close();  instruksi tersebut menutup program yang kemudian dapat menggunakan program lagi. C++ memperbolehkan membuka panggilan yang bervariasi denga construktor, sebagai contoh mengganti pada penulisan
 ifstreamdata_file;//Filedibacadari data_file.open("angka.dat");  dapat ditulis dengan  ifstreamdata_file("angka.dat"); 
 apalagi sebuah destruktor dengan otomatis memanggil close. Pada kasus tertentu jika sebuah file number.dat hilang, bagaimana dan dimana programer akan memberitahukan permasalahan tersebut?. Maka keanggotaan fungsi akan kembali dengan pesan kesalahan jika pada fungsi tersebut terdapat masalah, atau kesalahan yang mungkin terjadi. Sehigga untuk menguji apakah terdapat kesalahan atau tidak programer perlu menuliskan potongan program dibawah ini:
 if(data_file.bad()){ cerr<<"Unabletoopen numbers.dat\n"; exit(8); } 
 Program tersebut dibawah ini merupakan program pembacaan angka  Program 12.1 

#include<conio.h> #include<iostream> #include<fstream> #include<cstdlib> usingnamespacestd; intmain() { constintDATA_SIZE=100; //Jumlahitemdalamdata intdata_array[DATA_SIZE]; //ukurandata ifstreamdata_file("angkan.dat");//filemasukan inti;//penghitungLoop if(data_file.bad()){ cerr<<"Error:tidakdapatmembukafileangka.dat\n"; exit(8); } for(i=0;i<DATA_SIZE;++i){ assert(i>=0); assert(i<sizeof(data_array)/sizeof(data_array[0])); data_file>>data_array[i]; } inttotal;//Totalangka total=0; for(i=0;i<DATA_SIZE;++i){ assert(i>=0); assert(i<sizeof(data_array)/sizeof(data_array[0])); total+=data_array[i]; } cout<<"Totaldarisemuaangkaadalah:"<<total<<'\n'; getch(); return(0); }  

Jika programmer ingin membaca baris dari data, maka harus menggunakan fungsi getline. Dimana hal tersebut didefinisikan pada potongan program dibawah ini:
 istream&getline(istream&input_file, string&the_string); istream&getline(istream&input_file, string&the_string,char delim)
  fungsi tersebut membaca baris yag disimpannya dalam string. Sebuah fungsi referensi kembali menuju input stream. Bentuk kedua dari fungsi ini memperbolehkan programmer menuju baris khusus atau batas

Next read halaman 5.
tutorial operasi file halaman 3

tutorial operasi file halaman 3

Selamat datang di eagleboot dan selamat membaca.

Class-class tersebut diatas digunakan sebagai masukan dan keluaran dan menampilkan pada layar monitor dan keboard dideklarasikan oleh file header IOSTREAM. Class-class yang digunakan secara khusus untuk input atau ouput file pada disk dideklarasikan oleh file header FSTREAM. Gambar diatas menunjukan class-class yang mana didalamnya dapat ditemukan dua file header tersebut. Selain itu juga ditunjukan beberapa manipulator  yang dideklarasikan dalam IOMANIP dan dalam memori, class dideklarasikan dalam STRSTREAM.  Seperti yang dapat dilihat pada gambar diatas, class ios yang merupakan class dasar pada sebuah hirarky. Class tersebut berisi beberapa konstanta atau keanggotaan fungsi umum sebagai operasi masukan dan keluaran.  Class ios juga berisi senuah pointer yang digunakan sebagai class streambuf. Dimana hal tersebut berisi buffer memori aktual pada saat data dibaca atau ditulis. Biasanya programmer tidak memikirkan class streambuf, karena hal tersebut akan ditangani secara otomatis oleh class lain. Class istream dan ostream diturunkan dari ios dan akan digunakan sebagai masukan dan keluaran secara terus-menerus. Class istream berisi  seperti fungsi get(), getline(), read() dan operator ekstrasi overloded (>>), sedangkan ostream berisi put() dan write() serta operator insersi overloaded (<<). Class iostream adalah diturunkan dari dua class istream dan ostream melalui multiple inheritance. Class yang diturunkan tersebut akan digunakan oleh beberapa piranti seperti file pada disk, yang mungkin. akan dibuka sebagai masukan dan keluaran pada saat yang sama. Tiga class istream_withassign, ostream_withassign dan iostream_withassign diwariskan dari istream, ostream dan iostream secara berturut-turut.  Class ios adalah kakek dari semua class-class stream dan berisi secara umum dari hal-hal yang penting yang dibutuhkan untuk mengoperasikan stream pada C++. Ada tiga hal penting yaitu pengaturan flag, flag status kesalahan dan file mode operasi. Pengaturan flag merupakan sekumpulan enum yang didefinisikan dalam ios. Hal tersebut merupakan kondisi seperti saklar on atau off yang memilih  

12.4. File Input/Output C++

 Input/output file pada bahasa C++ ditentukan oleh tiga class  yaitu class istream untuk menangani masukan file, class ostream untuk menangani keluaran file serta class iostream untuk menangani file masukan atau keluaran. Dalam C++ operasi ini berkenaan bahwa file sebagai stream dan saat itu pula file dianggap sebagai aliran byte data. Empat class variabel akan secara otomatis dibuat ketika program dimulai. Perhatikan tabel dibawah ini:  
Tabel  12.1. Variabel class I/O pada C++ yang dikenal
 VARIABEL DIGUNAKAN cinConsoleinput(standarinput) coutConsoleoutput(standaroutput) cerrConsoleerror(standarerror) clogConsolelog 

 Variabel-variabel tersebut di definisikan dalam file standar include <iostream>. Pada umumnya  cin digunakan oleh keyboard dan  cout,  ceer dan  clog digunakan untuk menampilkan ke screen monitor. Kebanyakan sistem operasi memperbolehkan programer mengubah arah melalui I/O. sebagai contoh perintah dibawah  ini:  my_prog<file.in  ketika dijalankan program dengan nama my_prog dan tugas yang diberikan  cin adalah file.in.  ketika sedang mengerjakan operasi file pada disk, diharuskan menggunakan versi file pada class stream. Dalam hal ini  ifstream,  ofstream dan fstream akan didefinisikan dalam file include <fstream>.  Seandainya programmer ingin membaca 100 angka yang berurutan dari sebuah file dengan nama number.dat misalnya, maka programmer harus mendeklarasikan variabel masukan file sebagai berikut: 
ifstreamdata_file;

Next read halaman 4.
tutorial operasi file halaman 2

tutorial operasi file halaman 2

Selamat datang di eagleboot dan selamat membaca.

alokasi 4096 byte, komputer akan mengalokasikan dua buah unit alokasi, yang berukuran 4096 dan 4096, sehingga menghabiskan 8192 byte. Meski ukuran logis berkas tersebut 5125 byte, komputer mengalokasikan 8192 byte, membuat 3067 byte tidak digunakan (disebut sebagai wasted space atau slack space).  Kebanyakan sebuah program melibatkan media disk sebagai tempat untuk membaca atau menyimpan data. Data sendiri disimpan dalam disk dalam suatu kesatuan yang disebut file. Suatu file merupakan organisasi dari sejumlah record. Masing-masing record dapat terdri dari satu atau beberapa field dan setiap field terdiri dari satu atau beberapa byte data. Satu byte data terdiri dari susuan 8 bit data. Struktur data dari fle ditunjukkan pada gambar berikut dibawah ini: 

File Record..............Record FieldFieldField Byte (8 bit)..............Byte (8 bit)

  Gambar 12.2. Struktur Data Dari File  Dalam C++ file adalah sebuah stream yang disimpan dalam media penyimpanan luar. Karena merupakan sebuah stream, operasi yang berlaku pada stream berlaku juga untuk file. Stream adalah suatu logika device yang  menghasilkan dan menerima informasi atau wadah yang digunakan untuk menampung keluaran dan menampung aliran data. 

 12.2. Class stream 

Stream (aliran) merupakan nama yang secara umum diberikan untuk sebuah aliran data. Dalam C++ stream ditunjukan oleh sebuah objek dari class khusus, dimana telah kita ketahui cin dan cout merupakan abjek stream. Perbedaan stream yang digunakan untuk menunjukan perbedaan beberapa macam dari aliran data. Sebagai contoh sebuah class ifstream merepresentasikan aliran data dari masukan file-file disk.  Programer C mungkin akan heran dengan melihat kelebihan- kelebihan menggunakan class stream untuk operasi I/O, sebagai ganti dari fungsi-fungsi C sebelumnya seperi printf() dan scanf() dan operasi file seperti fprintf(), fscanf() dan lain sebagainya. Satu alasannya adalah kesederhanaan. Jika kita pernah menggunakan format karakter %d anda baru akan menyadarinya. Disana ternyata tidak ditemui format dalam stream semenjak sebuah objek siap ditunjukan pada tampilan komputer.  Alasam lain adalah bahwa kamu dapat memberi beban pada sebuah operator dan fungsi seperti operator insertion (<<) dan extraction (>>), dimana untuk dapat bekerja dengan class tersebut anda harus membuatnya. Hal ini akan membuat class anda bekerja pada jalan yang sama sebagai satu-kesatuan tipe. Hal ini jelas membuat programer lebih mudah dan lebih terbebas dari kesalahan. Anda mungkin heran jika stream I/O ternyata penting jika anda merancang progra dalam sebuah lingkungan dengan Graphic user Interface (GUI) seperti halnya windows. Dengan menggunakan GUI ini secara langsung teks keluaran ditampilkan pada screen . Anda juga masih dan selalu membutuhkan mengenai stream pada bahasa C++.  Hal ini akan terjadi karena mereka tahu jalan terbaik untuk menulis data menjadi file dan juga memformat data yang aka digunakan kemudian dalam teks I/O atau elemen GUI lainnya.

  12.3. Hirarki class stream

 Sebuah class stream diatur dalam hirarki yang agak komplek. Dengan menggunakan class ini, kita dapat membuat tambahan class dengan menggunakan beberapa class istream. Operator turunan >> merupakan bagian dari class stream, dan operator insertion << adalah bagian dari class ostream. Keduanya merupakan class-class yang diturunkan dari class ios. Sebuah objek cout merepresentasikan keluaran stream keluaran, yang biasanya diarahkan pada tampilan monitor. Obyek tersebut sudah dikenal sebagai class penentu ostream. Sama halnya dengan cin sebagai obyek penentu istream yang diturunkan dari class istream.  Gambar dibawah ini menunjukan pengaturan class-class yang paling penting.

Next read halaman 3.
tutorial operasi file

tutorial operasi file

Selamat datang di eagleboot dan selamat membaca.

BAB 12 OPERASI FILE  

12.1. Pengertian File 
12.2. Class stream 
12.3. Hirarki class stream 
12.4. File Input/Output C++ 
12.5. Cara Pembacaan String 
12.6. Routin-routin konversi File
 12.7. File Binary dan ASCII 
 12.8. Binary I/O 12.9. Buffer
 12.10. Rutin-rutin pada C++
 12.11. File sekuensial
 12.12. Program Operasi  FiIe

12.1. Pengertian File

 File atau Berkas komputer atau berkas adalah entitas dari data yang disimpan di dalam sistem berkas yang dapat diakses dan diatur oleh pengguna. File juga dapat didefinisikan sebagai kumpulan informasi yang biasanya disimpan dalam sebuah disk komputer, dimana informasi disimpan dalam bentuk file- file yang dikemudian hari dapat diambil kembali. Sebuah berkas memiliki nama yang unik dalam direktori dimana ia berada. Alamat direktori dimana suatu berkas ditempatkan diistilahkan dengan path. File atau berkas diorganisasikan dari sejumlah record. Masing-masing record bisa terdiri dari satu atau beberapa field. Setiap field terdiri dari satu atau beberapa byte.  


Sistem berkas akan memberikan sebuah nama terhadap sebuah berkas agar dapat dikelola dengan mudah. Meski oleh sistem berkas penamaan dilakukan dengan menggunakan angka-angka biner, sistem operasi dapat menerjemahkan angka-angka biner tersebut menjadi karakter yang mudah dipahami. Sebuah berkas berisi aliran data (data stream) yang berisi sekumpulan data yang saling berkaitan serta atribut berkas (yang bersifat wajib atau opsional), yang kadang-kadang disebut properties yang berisi informasi yang berkaitan dengan berkas yang bersangkutan. Informasi mengenai kapan sebuah berkas dibuat adalah contoh dari atribut berkas. Ukuran sebuah berkas umumnya direpresentasikan dalam satuan byte. Jika bilangan terlalu besar untuk direpresentasikan dalam satuan byte, maka dapat menggunakan satuan KB (Kilobyte, yang berarti 1,024 byte), MB (Megabyte, yang berarti 1,048,576 byte), GB (Gigabyte, yang berarti 1,073,741,824 byte), dan TB (Terabyte, yang berarti 1,099,511,627,776 byte). Dalam mekanisme penyimpanan berkas, komputer akan menyimpan berkas dalam dua jenis ukuran: ukuran fisik dan ukuran logis. Ukuran fisik berkas merujuk kepada ukuran aktual dari berkas, yakni berapa banyak byte yang terdapat di dalam berkas. Sementara ukuran logis merujuk kepada jumlah ruangan yang dialokasikan oleh sistem berkas untuk menempatkan berkas yang bersangkutan di dalam media penyimpanan.  Ukuran berkas fisik umumnya lebih besar dibandingkan dengan ukuran berkas logisnya. Sebagai contoh, untuk mengalokasikan berkas berukuran logis 5125 byte, dalam sebuah media penyimpanan yang diformat dengan sistem berkas yang menggunakan ukuran unit.

Next read halaman 2.
tutorial graphic halaman 12

tutorial graphic halaman 12

Selamat datang di eagleboot dan selamat membaca.

pfd.iLayerType=PFD_MAIN_PLANE; iFormat=ChoosePixelFormat(*hDC,&pfd); SetPixelFormat(*hDC,iFormat,&pfd); /*createandenabletherendercontext(RC)*/ *hRC=wglCreateContext(*hDC); wglMakeCurrent(*hDC,*hRC); } /****************** *DisableOpenGL ******************/ voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC) { wglMakeCurrent(NULL,NULL); wglDeleteContext(hRC); ReleaseDC(hWnd,hDC); }

  Jika program dijalankan maka kotak akan bergerak secara diagonal dari pojok kiri bawah ke arah pojok kanan atas dengan warna ungu, setelah sampai di pojok kanan atas maka akan berbalik arah menuju pojok kiri bawah lagi dengan warna hijau, begitu seterusnya bolak-balik. Akan tetapi jika kursor menunjuk taskbar dan tombol mouse ditekan maka gerak obyek akan berhenti dan jika tombol dilepas lagi maka obyek tersebut gergerak lagi. Selain argumen-argumen glTranslatef() yang dimodifikasi, argumen glColor3f() juga dibuat variabel sehingga bisa dimainkan warnanya menjadi dinamis tidak monoton. Penambahan variabel pada perintah glColor3f() argumen pertama r, kedua g, ketiga b, sehingga formatnya menjadi glColor3f(r, g, b). Modifikasi yang lain yaitu menambah variabel count untuk menghitung banyaknya gerak. Hal ini perlu ditambahkan karena pengaturan gerak melalui variabel count ini. Contoh ini merupakan dasar pembuatan game yang harus dipelajari untuk bisa dikembangkan dikemudian hari. Bagian yang penting dicermati adalah trik pengaturan geraknya, bagian ini merupakan hal tersulit karena harus menemukan algoritma yang tepat dan efisien. 

Next read BAB 12. OPERASI FILE 
tutorial graphic halaman 11

tutorial graphic halaman 11

Selamat datang di eagleboot dan selamat membaca.

 /*enableOpenGLforthewindow*/ EnableOpenGL(hWnd,&hDC,&hRC); /*programmainloop*/ while(!bQuit) { /*checkformessages*/ if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { /*handleordispatchmessages*/ if(msg.message==WM_QUIT) { bQuit=TRUE; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { /*OpenGLanimationcodegoeshere*/ glClearColor(1.0f,1.0f,1.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glTranslatef(theta,alpha,0.0f); glColor3f(r,g,b); glRectf(‐0.2,0.2,0.2,‐0.2); glPopMatrix(); SwapBuffers(hDC); if(count>160) { theta‐=0.01f; alpha‐=0.01f; if(count==320) { 
count=0; theta=‐0.8f; alpha=‐0.8f; } else count+=1; r=0.0f; g=1.0f; b=0.0f; } elseif(count<=160) { theta+=0.01f; alpha+=0.01f; count+=1; r=1.0f; g=0.0f; b=1.0f; } Sleep(10); } } /*shutdownOpenGL*/ DisableOpenGL(hWnd,hDC,hRC); /*destroythewindowexplicitly*/ DestroyWindow(hWnd); returnmsg.wParam; } /******************** *WindowProcedure ********************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage, WPARAMwParam,LPARAMlParam) { switch(message) {  caseWM_CREATE: return0; caseWM_CLOSE: PostQuitMessage(0); return0; caseWM_DESTROY: return0; caseWM_KEYDOWN: switch(wParam) { caseVK_ESCAPE: PostQuitMessage(0); return0; } return0; default: returnDefWindowProc(hWnd,message,wParam,lParam); } } /******************* *EnableOpenGL *******************/ voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC) { PIXELFORMATDESCRIPTORpfd; intiFormat; /*getthedevicecontext(DC)*/ *hDC=GetDC(hWnd); /*setthepixelformatfortheDC*/ ZeroMemory(&pfd,sizeof(pfd)); pfd.nSize=sizeof(pfd); pfd.nVersion=1; pfd.dwFlags=PFD_DRAW_TO_WINDOW| PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER; pfd.iPixelType=PFD_TYPE_RGBA; pfd.cColorBits=24; pfd.cDepthBits=16;


Next read halaman 12
tutorial graphic halaman 10

tutorial graphic halaman 10

Selamat datang di eagleboot dan selamat membaca.

pfd.iLayerType=PFD_MAIN_PLANE; iFormat=ChoosePixelFormat(*hDC,&pfd); SetPixelFormat(*hDC,iFormat,&pfd); /*createandenabletherendercontext(RC)*/ *hRC=wglCreateContext(*hDC); wglMakeCurrent(*hDC,*hRC); } /****************** *DisableOpenGL ******************/ voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC) { wglMakeCurrent(NULL,NULL); wglDeleteContext(hRC); ReleaseDC(hWnd,hDC); } 

Hasil eksekusi program di atas akan menggerakkan sebuah kotak berjalan secara diagonal dari pojok kiri bawah ke kanan atas secara terus menerus. Akan tetapi jika ada penekanan mouse di taskbar maka kotak berhenti, jika penekanan dilepas kotak jalan lagi. Untuk selesai bisa menggunakan tombol ESCape.  

11.5. Dasar-dasar Game

 Untuk memahami pembuatan game contoh program di atas bisa dimodifikasi bagian glTranslatef(). Argumen dalam glTranslatef () dibuat variabel theta untuk argumen pertama, alpha untuk argumen kedua. Theta untuk mengatur gerak horisontal dan alpha untuk mengatur gerak vertikal. Dengan mengubah- ubah nilai variabel tersebut kita bisa menggerakkan obyek tersebut secara bebas sesuai dengan kehendak. Pada saat obyek bergerak bisa juga diatur perubahan warna atau dikombinasi sehingga menjadi warna- warni. Untuk lebih jelasnya ikuti program berikut:  Program 11.7
 #include<windows.h> #include<gl/gl.h> /************************** *FunctionDeclarations **************************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,  WPARAMwParam,LPARAMlParam); voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC); voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC); /************************** *WinMain **************************/ intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intiCmdShow) { WNDCLASSwc; HWNDhWnd; HDChDC; HGLRChRC; MSGmsg; BOOLbQuit=FALSE; floattheta=‐0.8f; floatalpha=‐0.8f; intcount=0; floatr,g,b; /*registerwindowclass*/ wc.style=CS_OWNDC; wc.lpfnWndProc=WndProc; wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hInstance=hInstance; wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszMenuName=NULL; wc.lpszClassName="GraphGL"; RegisterClass(&wc); /*createmainwindow*/ hWnd=CreateWindow( "GraphGL","OpenGLGraphics", WS_CAPTION|WS_POPUPWINDOW|WS_VISIBLE, 0,0,512,512, NULL,NULL,hInstance,NULL);

Next read halaman 11.
tutorial graphic halaman 9

tutorial graphic halaman 9

Selamat datang di eagleboot dan selamat membaca.

wc.cbWndExtra=0; wc.hInstance=hInstance; wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszMenuName=NULL; wc.lpszClassName="GraphGL"; RegisterClass(&wc); /*createmainwindow*/ hWnd=CreateWindow( "GraphGL","OpenGLGraphicsAnimation", WS_CAPTION|WS_POPUPWINDOW|WS_VISIBLE, 0,0,512,512, NULL,NULL,hInstance,NULL); /*enableOpenGLforthewindow*/ EnableOpenGL(hWnd,&hDC,&hRC); /*programmainloop*/ while(!bQuit) { /*checkformessages*/ if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { /*handleordispatchmessages*/ if(msg.message==WM_QUIT) { bQuit=TRUE; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { /*OpenGLanimationcodegoeshere*/ glClearColor(1.0f,1.0f,1.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glTranslatef(theta,alpha,0.0f); glColor3f(1.0f,0.0f,1.0f); glRectf(‐0.2,0.2,0.2,‐0.2); glPopMatrix(); SwapBuffers(hDC); if(theta>=1.0) { theta=‐1.0f; alpha=‐1.0f; } elseif(theta<=1.0) { theta+=0.01f; alpha+=0.01f; } Sleep(10); } } /*shutdownOpenGL*/ DisableOpenGL(hWnd,hDC,hRC); /*destroythewindowexplicitly*/ DestroyWindow(hWnd); returnmsg.wParam; } /******************** *WindowProcedure ********************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage, WPARAMwParam,LPARAMlParam) { switch(message) { caseWM_CREATE: return0; caseWM_CLOSE: PostQuitMessage(0); return0; caseWM_DESTROY: return0; caseWM_KEYDOWN: switch(wParam) { caseVK_ESCAPE: PostQuitMessage(0); return0; } return0; default: returnDefWindowProc(hWnd,message,wParam,lParam); } } /******************* *EnableOpenGL *******************/ voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC) { PIXELFORMATDESCRIPTORpfd; intiFormat; /*getthedevicecontext(DC)*/ *hDC=GetDC(hWnd); /*setthepixelformatfortheDC*/ ZeroMemory(&pfd,sizeof(pfd)); pfd.nSize=sizeof(pfd); pfd.nVersion=1; pfd.dwFlags=PFD_DRAW_TO_WINDOW| PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER; pfd.iPixelType=PFD_TYPE_RGBA; pfd.cColorBits=24; pfd.cDepthBits=16; 

Next read halaman 10.
tutorial graphic halaman 8

tutorial graphic halaman 8

Selamat datang di eagleboot dan selamat membaca.

contoh, argumen diisi angka -1 (- 1.0)  Argumen ketiga juga mirip dengan argumen kedua namun berputarnya terhadap sumbu vertical (tegak lurus)   Argumen keempat untuk memutar kotak flat dengan sumbu titik nol diagram cartesius. Jika diisi angka 1 (1.0) maka akan berputar berlawanan arah putaran jarum jam (counter clockwise), sedangkan untuk berputar searah dengan arah putaran jarum jam (clockwise) diisi angka -1 (-1.0). Hal yang menarik jika argumen ini diisi angka 0 (0.0) maka kotak akan zoom in dan zoom out bergantian.  Kombinasi dari argumen-argumen yang ada akan membuat variasi pergerakan yang sangat menarik Untuk mengatur laju perputaran animasi yang terjadi bisa dengan memodifikasi theta, atau dengan perintah sleep(argumen). Laju kecepatan putar tergantung pada nilai argumen pada sleep, makin besar angkanya makin lambat bukan makin cepat. Lebih lanjut dengan grafik, jika akan membuat segi enam maka perubahan yang terjadi seperti berikut:  Program 11.5 
/*OpenGLanimationcodegoeshere*/ glClearColor(0.0f,0.0f,0.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glRotatef(theta,0.0f,0.0f,‐1.0f); glBegin(GL_POLYGON); glColor3f(1.0f,0.0f,0.0f);glVertex2f(‐0.3f,0.54f); glColor3f(0.0f,1.0f,0.0f);glVertex2f(0.3f,0.54f); glColor3f(0.0f,0.0f,1.0f);glVertex2f(0.61f,0.0f); glColor3f(0.0f,1.0f,1.0f);glVertex2f(0.3f,‐0.54f); glColor3f(1.0f,1.0f,0.0f);glVertex2f(‐0.3f,‐0.54f); glColor3f(1.0f,1.0f,1.0f);glVertex2f(‐0.61f,0.0f); glEnd(); glPopMatrix(); SwapBuffers(hDC); theta+=2.0f; Sleep(1); 

 Tentu saja vertex berubah bertambah banyak, banyaknya vertex sesuai dengan jumlah sudut yang dibentuk. Jangan lupa argumen pada glBegin diisi dengan GL_POLYGON sehingga bisa menciptakan segi banyak seperti yang dikehendaki. Selain glRotatef() pengaturan animasi dapat juga dengan glTranslatef(). Dengan perintah ini kita dapat menggerakkan obyek kekiri, kekanan, ke atas, maupun ke bawah. Contoh program sebagai berikut:  Program 11.6 #include<windows.h> #include<gl/gl.h> /************************** *FunctionDeclarations **************************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage, WPARAMwParam,LPARAMlParam); voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC); voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC); /************************** *WinMain **************************/ intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intiCmdShow) { WNDCLASSwc; HWNDhWnd; HDChDC; HGLRChRC; MSGmsg; BOOLbQuit=FALSE; floattheta=‐1.0f; floatalpha=‐1.0f; /*registerwindowclass*/ wc.style=CS_OWNDC; wc.lpfnWndProc=WndProc; wc.cbClsExtra=0;

Next read halaman 9.
tutorial graphic halaman 7

tutorial graphic halaman 7

Selamat datang di eagleboot dan selamat membaca.

return0; caseWM_DESTROY: return0; caseWM_KEYDOWN: switch(wParam) { caseVK_ESCAPE: PostQuitMessage(0); return0; } return0; default: returnDefWindowProc(hWnd,message,wParam,lParam); } } /******************* *EnableOpenGL *******************/ voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC) { PIXELFORMATDESCRIPTORpfd; intiFormat; /*getthedevicecontext(DC)*/ *hDC=GetDC(hWnd); /*setthepixelformatfortheDC*/ ZeroMemory(&pfd,sizeof(pfd)); pfd.nSize=sizeof(pfd); pfd.nVersion=1; pfd.dwFlags=PFD_DRAW_TO_WINDOW| PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER; pfd.iPixelType=PFD_TYPE_RGBA; pfd.cColorBits=24; pfd.cDepthBits=16; pfd.iLayerType=PFD_MAIN_PLANE; iFormat=ChoosePixelFormat(*hDC,&pfd); SetPixelFormat(*hDC,iFormat,&pfd); /*createandenabletherendercontext(RC)*/ *hRC=wglCreateContext(*hDC); wglMakeCurrent(*hDC,*hRC); } /****************** *DisableOpenGL ******************/ voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC) { wglMakeCurrent(NULL,NULL); wglDeleteContext(hRC); ReleaseDC(hWnd,hDC); } Keluaran program di atas akan menganimasikan kotak dengan warna-warni yang menarik dan berputar berlawanan arah jarum jam. Gambar kotak yang terjadi seperti berikut: 



 Gambar 11.4. Grafik berwarna warni  Jika diperhatikan atau dipelajari pasti akan Menarik bukan? Warna- warna tersebut dimunculkan dengan mengkombinasikan argumen- argumen pada perintah glColor3f, cermati dalam listing program. Dalam program yang sesungguhnya kotak tersebut selain berwarna-warni juga berputar berlawanan arah putaran jarum jam (counter clockwise). Perintah apa yang membuat kotak ini berputar ? Kita lihat program di atas: glRotatef(theta,0.0f,0.0f,1.0f);  sesuai namanya perintah di ataslah yang menyebabkan kotak ini berputar. Format perintah ini secara lengkapnya sebagai berikut : 

 Argumen pertama theta untuk mengatur kecepatan putar makin besar angkanya makin cepat putaran yang terjadi  Argumen kedua jika diisi 1 (1.0) maka kotak akan berputar dengan sumbu garis horizontal (mendatar) ke arah tertentu. Untuk memutar ke arah yang berlawanan dari

Next read halaman 8.
tutorial graphic halaman 6

tutorial graphic halaman 6

Selamat datang di eagleboot dan selamat membaca.

11.4. Animasi Grafik

 Pembuatan animasi bentuk- bentuk dasar dalam OpenGL telah disediakan. Untuk dapat memanfaatkannya kita harus memahami perintah-perintah itu beserta arti argumen-argumen yang dipakainya. Sebagai contoh akan dibuat sebuah program yang menganimasi kotak. Cermati program berikut:  Program 11.4 

#include<windows.h> #include<gl/gl.h> /************************** *FunctionDeclarations **************************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage, WPARAMwParam,LPARAMlParam); voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC); voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC); /************************** *WinMain **************************/ intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intiCmdShow) { WNDCLASSwc; HWNDhWnd; HDChDC; HGLRChRC; MSGmsg; BOOLbQuit=FALSE; floattheta=0.0f; /*registerwindowclass*/ wc.style=CS_OWNDC; wc.lpfnWndProc=WndProc; wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hInstance=hInstance; wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszMenuName=NULL; wc.lpszClassName="GLSample"; RegisterClass(&wc); /*createmainwindow*/ hWnd=CreateWindow( "GLSample","OpenGLSample", WS_CAPTION|WS_POPUPWINDOW|WS_VISIBLE, 0,0,256,256, NULL,NULL,hInstance,NULL); /*enableOpenGLforthewindow*/ EnableOpenGL(hWnd,&hDC,&hRC); /*programmainloop*/ while(!bQuit) { /*checkformessages*/ if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { /*handleordispatchmessages*/ if(msg.message==WM_QUIT) { bQuit=TRUE; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { /*OpenGLanimationcodegoeshere*/ glClearColor(1.0f,1.0f,1.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glRotatef(theta,0.0f,0.0f,1.0f); glBegin(GL_QUADS); glColor3f(1.0f,0.0f,0.0f);glVertex2f(‐0.5f,0.5f); glColor3f(0.0f,1.0f,0.0f);glVertex2f(0.5f,0.5f); glColor3f(0.0f,0.0f,1.0f);glVertex2f(0.5f,‐0.5f); glColor3f(0.0f,0.0f,0.0f);glVertex2f(‐0.5f,‐0.5f); glEnd(); glPopMatrix(); SwapBuffers(hDC); theta+=1.0f; Sleep(1); } } /*shutdownOpenGL*/ DisableOpenGL(hWnd,hDC,hRC); /*destroythewindowexplicitly*/ DestroyWindow(hWnd); returnmsg.wParam; } /******************** *WindowProcedure ********************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage, WPARAMwParam,LPARAMlParam) { switch(message) { caseWM_CREATE: return0; caseWM_CLOSE: PostQuitMessage(0);

Next read halaman 7.