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
/*
console-io.cpp 20130907.01
Sparisoma Viridi <dudung@gmail.com> Input dan output (I/O) in the console Compile: g++ console-io.cpp -o console-io Run: ./console-io
*/
#include <iostream> #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 << comp;
cout << "Selamat datang di Lab Komputasi Lanjut, "; cout << line << "." << endl;
cout << 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;
}
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 di-jalankan tanpa interaksi dengan pengguna, apabila telah diketahui jumlah ma-sukan 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 da-pat terbaca, sehingga dada-pat dilihat dalam sistem operasi Linux dengan meng-gunakan
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 keteran-gan di dalamnya.
/*
writehello.cpp
Nama Anda <email.anda.@mail-provider.com> yyyy.mm.dd.versi (misalnya: 2013.09.07.1)
Fungsi program (misalnya: Menuliskan kalimat "Hello world!" ke dalam suatu file teks
Compile: g++ writehello.cpp -o writehello Run: ./writehello */ #include <iostream> #include <fstream> 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 seba-gaimana petunjuk di dalamnya.
/*
writehelloarg.cpp
Sparisoma Viridi <dudung@gmail.com> 2013.09.07.1
Menuliskan kalimat "Hello world!" ke dalam suatu file teks di mana nama keluaran diberikan melalui argumen
program
Compile: g++ writehelloarg.cpp -o writehelloarg Run: ./writehello */ #include <iostream> #include <fstream> #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
5
Menuliskan banyak kata tanpa dapat diedit
Salin, kompilasi, dan jalankan kode berikut ini seperti petunjuk dalam keteran-gan programnya.
/*
writewords.cpp 20130907.01
Sparisoma Viridi <dudung@gmail.com>
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 <iostream> #include <fstream> #include <string> #include <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’) {
} 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. Un-tuk 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 keteran-gan programnya.
/*
writexy.cpp 20130908.01
Sparisoma Viridi <dudung@gmail.com> Write pains of data x and y
Run: ./writexy [filename] */ #include <iostream> #include <fstream> #include <stdlib.h> #include <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;
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). Perik-salah 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 keteran-gan programnya.
/*
readfile.cpp 20130908.01
Sparisoma Viridi <dudung@gmail.com> Read a common text file
Compile: g++ readfile.cpp -o readfile Run: ./readfile filename
*/ #include <iostream> #include <fstream> #include <stdlib.h> #include <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: ";
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 keteran-gan programnya.
/*
readxy.cpp 20130908.01
Sparisoma Viridi <dudung@gmail.com>
Read a common text file for data pairs x and y Compile: g++ readxy.cpp -o readxy
Run: ./readxy filename */ #include <iostream> #include <fstream> #include <stdlib.h> #include <string.h> #include <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 < 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; }
}
}
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 keteran-gan programnya.
/*
absxy.cpp 20130908.01
Sparisoma Viridi <dudung@gmail.com>
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 <iostream> #include <fstream> #include <stdlib.h> #include <string.h> #include <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) {
} 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 << 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.
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