P02 | Menulis dan Membaca Berkas Teks Modul Praktikum FI2283 Pemrograman dan Simulasi Fisika Versi 2013.09.09
Catatan. Perhatikan berkas (atau file) apa yang harus anda buat dalam setiap tugas. Setiap kali praktikum buat folder baru dengan nama Modul NN dimana NN merupakan nomor praktikum. Bila berkas Anda tidak ditemukan maka nilai praktikum hanya dari angka kehadirannya saja. 1 Input dan output pada konsol
11
2 Piping pada program yang menggunakan cin
13
3 Menulis ke dalam berkas teks
13
4 Menulis berkas teks dengan argumen program
14
5 Menuliskan banyak kata tanpa dapat diedit
16
6 Menuliskan pasangan data x dan y
17
7 Membaca berkas teks
19
8 Membaca berkas teks pasangan data x dan y
20
9 Membaca dan menulis berkas data x dan y
22
10 Perkenalan dengan gnuplot
24
1
Input dan output pada konsol
Ketiklah program berikut ini
11
/* console-io.cpp 20130907.01 Sparisoma Viridi
Input dan output (I/O) in the console Compile: g++ console-io.cpp -o console-io Run: ./console-io */ #include #include <string> using namespace std; int main(int argc, char *argv[]) { char comp[] = "COMP: "; string line; int NIM; cout << comp; cout << "Siapakah nama Anda?" << endl; cin >> line; cout << endl; cout cout cout cout
<< << << <<
comp; "Selamat datang di Lab Komputasi Lanjut, "; line << "." << endl; endl;
cout << comp; cout << "Berapakah NIM Anda, "; cout << line << "?" << endl; cin >> NIM; cout << endl; bool ganjil = (bool) (NIM % 2); if(ganjil) { cout << comp; cout << line << ", Anda terdaftar pada kelompok ber-Nim ganjil." << endl; } else { cout << comp; cout << line << ", Anda terdaftar pada kelompok ber-NIM genap." << endl; } cout << endl; return 0; 12
} Tugas 1. Kompilasi program console-io.cpp di atas sehingga menghasilkan perintah console-io dan jalankan seperti pada keterangan dalam program tersebut. Laporkan hasilnya dalam berkas laporan.txt dan berikan penjelasan fungsi dari dua perintah C++, yaitu cin dan cout.
2
Piping pada program yang menggunakan cin
Setiap program C++ yang di dalamnya memanfaatkan perintah cin dapat dijalankan tanpa interaksi dengan pengguna, apabila telah diketahui jumlah masukan yang diperlukan. Pada program console.cpp sebelumnya diperlukan dua masukan, yaitu nama dan NIM. Tugas 2. Jalankan perintah console-io dengan cara echo Tintin 10209323 | ./console-io dan laporlan hasilnya dalam berkas laporan.txt.
3
Menulis ke dalam berkas teks
Berkas teks adalah berkas yang secara umum berisi karakter-karakter yang dapat terbaca, sehingga dapat dilihat dalam sistem operasi Linux dengan menggunakan cat nama-file di mana nama-file adalah nama berkas yang ingin dilihat isinya. Berkas-berkas C++ yang memiliki ekstensi .cpp adalah contoh dari berkas teks, termasuk juga berkas laporan.txt. Salinlah kode di bawah ini dan simpan, kompilasi, serta jalankan seperti keterangan di dalamnya. /* writehello.cpp Nama Anda <[email protected]> yyyy.mm.dd.versi (misalnya: 2013.09.07.1) Fungsi program (misalnya: Menuliskan kalimat "Hello world!" ke dalam suatu file teks 13
Compile: g++ writehello.cpp -o writehello Run: ./writehello */ #include #include using namespace std; int main(int argc, char *argv[]) { // Filename char filename[] = "hello.txt"; // Output file stream ofstream fout; // Open an output file stream with certain filename fout.open(filename); // Write to the output file stream fout << "Hello world!" << endl; // Close the file stream fout.close(); // Return state of the program return 0; } Tugas 3. Jelaskan dalam laporan.txt apa yang dihasilkan oleh program writehello.cpp dan apa isinya.
4
Menulis berkas teks dengan argumen program
Dalam kode di bawah ini, program sebelumnya dimodifikasi sehingga nama berkas keluaran menjadi lebih fleksibel. Salin, kompilasi, dan jalankan sebagaimana petunjuk di dalamnya. /* writehelloarg.cpp Sparisoma Viridi 2013.09.07.1 Menuliskan kalimat "Hello world!" ke dalam suatu file teks di mana nama keluaran diberikan melalui argumen 14
program Compile: g++ writehelloarg.cpp -o writehelloarg Run: ./writehello */ #include #include #include <string.h> using namespace std; int main(int argc, char *argv[]) { // Default Filename char filename[] = "hello.txt"; // Change default name if output filename is provided if(argc > 1) { strcpy(filename, argv[1]); } // Output file stream ofstream fout; // Open an output file stream with certain filename fout.open(filename); // Write to the output file stream fout << "Hello world!" << endl; // Close the file stream fout.close(); // Return state of the program return 0; } Tugas 4. Jelaskan dalam laporan.txt apa yang perbedaan dari menjalan perintah writehelloarg dengan kedua cara berikut ini ./writehelloarg dan ./writehelloarg hello2.txt
15
5
Menuliskan banyak kata tanpa dapat diedit
Salin, kompilasi, dan jalankan kode berikut ini seperti petunjuk dalam keterangan programnya. /* writewords.cpp 20130907.01 Sparisoma Viridi Write some words for some lines, terminate the program by providing ’x’ charater then press enter Compile: g++ writewords.cpp -o writewords Run: ./writewords */ #include #include #include #include
<string> <stdio.h>
using namespace std; int main(int argc, char *argv[]) { bool NO_FILENAME = true; bool EXIT = false; string filename; string word; string line; cout << "Output filename = "; cin >> filename; ofstream fout; fout.open(filename.c_str()); cout << endl; cout << "Type x <enter> to exit" << endl; cout << endl; if(fout.is_open()) { int i = 0; bool FIRST_TIME = true; while(!EXIT) { char ch = getchar(); if(ch == ’x’) { EXIT = true;
16
} else { // Avoid extra blank line in output file if(!FIRST_TIME) { fout << ch; fout << flush; } } FIRST_TIME = false; } fout.close(); } else { cout << "Error: "; cout << filename << " can not be opened."; cout << endl; } return 0; } Tugas 5. Jalankan writewords, kemudian saat diminta Output filename = masukkan mywords.txt, tekan enter, dan ketikkan kata-kata atau kalimat apa saja. Untuk menghakhiri suatu baris kalimat gunakan tombol enter. Untuk mengakhiri mode masukan, ketikkan x dan tekan enter. Jelaskan apakah yang Anda tuliskan pada konsol sama dengan yang tersimpan dalam berkas mywords.txt, serta tunjukkan bagian mana dari program (dengan menyalin baris-baris perintah C++ terkait) yang merupakan bagian terminasi program yang menggunakan karakter x tersebut. Ketik jawaban Anda dalam berkas laporan.txt.
6
Menuliskan pasangan data x dan y
Salin, kompilasi, dan jalankan kode berikut ini seperti petunjuk dalam keterangan programnya. /* writexy.cpp 20130908.01 Sparisoma Viridi Write pains of data x and y Compile: g++ writexy.cpp -o writexy 17
Run: ./writexy [filename] */ #include #include #include #include
<stdlib.h> <string.h>
using namespace std; int main(int argc, char *argv[]) { // Default output filename char ofn[] = "data-xy.txt"; if(argc > 1) { // Change output filename if new name provided strcpy(ofn, argv[1]); } // Output file stream ofstream fout; fout.open(ofn); if(fout.is_open()) { // Header for readability fout << "#x\ty" << endl; // Generate data pairs x and y for(int i = 0; i <= 10; i++) { double x = (double) i; double y = (x - 3) * (x - 7); fout << x << "\t"; fout << y << endl; } // Close file stream fout.close(); } else { // Verbose message if output file can not be opened cout << "Error: " << ofn << " can not be opened."; cout << endl; } // Terminate the program return 0; }
18
Tugas 6. Tuliskan hubungan antara x dan y dalam bentuk y = f (x) dalam berkas laporan.txt. Tuliskan pula nilai dari f (10), f (5), serta f (7). Periksalah apakah isi dari berkas yang dihasilkan oleh perintah writexy sama seperti yang dicantumkan dalam kode program? Jelaskan jawaban Anda dalam berkas laporan.txt.
7
Membaca berkas teks
Salin, kompilasi, dan jalankan kode berikut ini seperti petunjuk dalam keterangan programnya. /* readfile.cpp 20130908.01 Sparisoma Viridi Read a common text file Compile: g++ readfile.cpp -o readfile Run: ./readfile filename */ #include #include #include #include
<stdlib.h> <string.h>
using namespace std; int main(int argc, char *argv[]) { if(argc < 2) { cout << "Usage: readfile filename" << endl; } else { char *ifn = argv[1]; ifstream fin; fin.open(ifn); if(fin.is_open()) { string line; while(!fin.eof()) { getline(fin, line); cout << line << endl; } fin.close(); } else { cout << "readfile: "; cout << ifn << " can not be opened" << endl; 19
exit(1); } } return 0; } Tugas 7. Jalankan perintah readfile dengan cara ./readfile dan ./readfile data-xy.txt serta ./readfile data-xyz.txt lalu laporkan hasil ketiganya dalam berkas laporan.txt.
8
Membaca berkas teks pasangan data x dan y
Salin, kompilasi, dan jalankan kode berikut ini seperti petunjuk dalam keterangan programnya. /* readxy.cpp 20130908.01 Sparisoma Viridi Read a common text file for data pairs x and y Compile: g++ readxy.cpp -o readxy Run: ./readxy filename */ #include #include #include #include #include
<stdlib.h> <string.h> <sstream>
using namespace std; 20
int main(int argc, char *argv[]) { // Reserve array // Next time you should be able to define number of data // before reserve the array size int N = 11; double x[N]; double y[N]; if(argc < 2) { cout << "Usage: readxy filename" << endl; } else { // Read input file char *ifn = argv[1]; ifstream fin; fin.open(ifn); if(fin.is_open()) { string line; int i = 0; while(!fin.eof()) { getline(fin, line); // Skip the header line that begins with ’#’ if(line[0] != ’#’) { stringstream ss; ss << line << endl; ss >> x[i]; ss >> y[i]; i++; } } fin.close(); } else { cout << "readfile: "; cout << ifn << " can not be opened" << endl; exit(1); } // Display reading results for(int i = 0; i < N; i++) { cout << x[i] << "\t"; cout << y[i] << endl; } } return 0; 21
} Tugas 8. Jalankan perintah readxy dengan cara ./readxy data-xy.txt lalu laporan hasilnya dalam berkas laporan.txt. Apa perbedaan program readxy.cpp dengan readfile.cpp? Jelaskan pula dalam laporan.txt.
9
Membaca dan menulis berkas data x dan y
Salin, kompilasi, dan jalankan kode berikut ini seperti petunjuk dalam keterangan programnya. /* absxy.cpp 20130908.01 Sparisoma Viridi Read a common text file for data pairs x and y and calculate its absolute value and write the results into other file Compile: g++ absxy.cpp -o absxy Run: ./absxy input output */ #include #include #include #include #include
<stdlib.h> <string.h> <sstream>
using namespace std; int main(int argc, char *argv[]) { // Reserve array // Next time you should be able to define number of data // before reserve the array size int N = 11; double x[N]; double y[N]; if(argc < 3) { cout << "Usage: absxy input output" << endl; 22
} else { // Read input file char *ifn = argv[1]; ifstream fin; fin.open(ifn); if(fin.is_open()) { string line; int i = 0; while(!fin.eof()) { getline(fin, line); // Skip the header line that begins with ’#’ if(line[0] != ’#’) { stringstream ss; ss << line << endl; ss >> x[i]; ss >> y[i]; i++; } } fin.close(); } else { cout << "readfile: "; cout << ifn << " can not be opened" << endl; exit(1); } // Calculate absolute value for(int i = 0; i < N; i++) { y[i] = abs(y[i]); } // Open output file char *ofn = argv[2]; ofstream fout; fout.open(ofn); if(fout.is_open()) { // Write the results fout << "#x\ty" << endl; for(int i = 0; i < N; i++) { fout << x[i] << "\t"; fout << y[i] << endl; } fout.close(); } else { cout << "readfile: "; 23
cout << ofn << " can not be opened" << endl; exit(1); } } return 0; } Tugas 9. Jalankan perintah-perintah berikut ini ./writexy data-xy-org.txt ./absxy data-xy-org.txt data-xy-abs.txt Jelaskan hasilnya dalam laporan.txt mengenai perbedaan dari isi berkas data-xy-org.txt dan data-xy-abs.txt. Gunakan perintah diff dengan cara berikut ini diff data-xy-org.txt data-xy-abs.txt dan jelaskan hasilnya dalam laporan.txt.
10
Perkenalan dengan gnuplot
Tugas 10. Panggil gnuplot dengan gnuplot lalu ketikkan dalam lingkungan yang telah dipanggil, perintah berikut ini plot "data-xy-org.txt" w lp ps 2 pt 5, "data-xy-abs.txt" w lp ps 2 pt 6 dan laporkan hasilnya dalam laporan.txt terutama tentang pasangan data x dan y untuk data originalnya dan setelah dihitung nilai absolutnya.
24
Keluaran praktikum 1. console-io.cpp, writehello.cpp, hello.txt, hello2.txt, mywords.txt, writexy.cpp, data-xy.txt, readfile.cpp, readxy.cpp, absxy.cpp. 2. laporan.txt yang berisikan jawaban dari Tugas 1, 2, 3, 4, 5, 6, 7, 8, 9, 10.
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. 1 1 Sparisoma
Viridi , .., 2013
25
.
26