CSE1301 Sem 1-2001 4/8/2017 File I/O Lecture 19: File I/O
Topik Penanganan file Sequential dlm C Dasar-dasar fungsi File I/O Contoh: Menghitung kata dalam file
Penanganan file dalam C File perlu dibuka/opened sblm di pakai. Di asosiasikan dg "file handler" utk tiap file Metode: read, write, atau append Fungsi File input/output yg di pakai dalam penanganan file (bukan nama file). Perlu ditutup/close setelah di pakai. Fungsi dasar penanganan file: fopen(), fclose(), fscanf(), fprintf().
Contoh File I/O Tulis program dengan: Input daftar nama dari file, misal, names.lst (text file) Hitung jmlh nama dalam list Tandai tiap nama dalam file Output name dan tanda di simpan dalam file names_marks.dat
File I/O (Header) Step 0: Include stdio.h. #include <stdio.h> int main() { ... return 0; }
File I/O (File Pointer) Step 1: Deklarasikan file handler ( file pointer) dg FILE * utk tiap file. int main() { FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL; ... return 0; }
File I/O (Open) Step 2: Open file dg fopen(). int main() { FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL; inputfile = fopen(“Names.txt”, “r”); outputfile = fopen(“marks.dat”, “w”); currentfile = fopen(“logFile.txt”, “a”); ... return 0; }
File I/O (Open) Step 2: Open file using fopen(). Nama file int main() { FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL; inputfile = fopen(“Names.txt”, “r”); outputfile = fopen(“marks.dat”, “w”); currentfile = fopen(“logFile.txt”, “a”); ... return 0; } Nama file
Perhatian: mode "w" berarti meng-overwrites file, jika ada. File I/O (Open) Step 2: Open file using fopen(). Mode r : read w : write a : append int main() { FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL; inputfile = fopen(“Names.txt”, “r”); outputfile = fopen(“marks.dat”, “w”); currentfile = fopen(“logFile.txt”, “a”); ... return 0; } Perhatian: mode "w" berarti meng-overwrites file, jika ada.
Mengasosiasikan file handler utk setiap file yg File I/O (Open) Step 2: Open file using fopen(). int main() { FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL; inputfile = fopen(“Names.txt”, “r”); outputfile = fopen(“marks.dat”, “w”); currentfile = fopen(“logFile.txt”, “a”); ... return 0; } Mengasosiasikan file handler utk setiap file yg di pakai
File I/O (Error Check) Step 3: Check jika file sudah terbuka dg baik. int main() { FILE *inputfile; inputfile = fopen(“Names.txt”, “r”); if (inputfile == NULL) printf(“Tidak dpt membuka input file\n”); return 1; } ... return 0;
File I/O (Error Check) Step 3: Check jika file sudah terbuka dg baik. File handler Mjd NULL Saat muncul fopen() Error . int main() { FILE *inputfile; inputfile = fopen(“Names.txt”, “r”); if (inputfile == NULL) printf(“Tidak dpt membuka input file\n”); return 1; } ... return 0;
File I/O (Error Check) Step 3: Check jika file sudah terbuka dg baik. int main() { FILE *inputfile; inputfile = fopen(“Names.txt”, “r”); if (inputfile == NULL) printf(“Tidak dpt membuka input file\n”); return 1; } ... return 0; Akhiri program Jika di dalam Fungsi main ( ).
File I/O (Input) Step 4a: Pakai fscanf() utk input. #include <stdio.h> #define MAXLEN 100 int main() { FILE *inputfile = NULL; char name[MAXLEN]; int count; listnames.c
Recall: definisi Macro File I/O (Input) Step 4a: Pakai fscanf() utk input. #include <stdio.h> #define MAXLEN 100 int main() { FILE *inputfile = NULL; char name[MAXLEN]; int count; Recall: definisi Macro
File I/O (Input) Step 4a: Use fscanf() for input. listnames.c /* Asumsikan"names.lst" berisi daftar nama, buka file utk di baca.*/ inputfile = fopen("names.lst", "r"); if (inputfile == NULL) { printf("Error membuka file\n"); return 1; }
File I/O (Input) Step 4a: Use fscanf() for input. listnames.c /* Baca tiap nama dan hitung berapa banyak nama dalam file.*/ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) { count++; printf("%d. %s\n", count, name); } printf("\nJumlah nama yg di baca: %d\n", count); return 0;
Perlu file handler (“stream”), Bukan nama file. File I/O (Input) Step 4a: Pakai fscanf() utk input. listnames.c /* Baca tiap nama dan hitung berapa banyak nama dalam file.*/ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) { count++; printf("%d. %s\n", count, name); } printf("\nJumlah nama yg di baca: %d\n", count); return 0; Perlu file handler (“stream”), Bukan nama file.
File I/O (Input) Step 4a: Use fscanf() for input. Parameter lainya: listnames.c /* Baca tiap nama dan hitung berapa banyak nama dalam file.*/ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) { count++; printf("%d. %s\n", count, name); } printf("\nJumlah nama yg di baca: %d\n", count); return 0; Parameter lainya: Spt scanf() biasa.
File I/O (Input) Step 4a: Use fscanf() for input. listnames.c /* Baca tiap nama dan hitung berapa banyak nama dalam file.*/ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) { count++; printf("%d. %s\n", count, name); } printf("\nJumlah nama yg di baca: %d\n", count); return 0; fscanf() mengembalikan jmlh input item yg di konver dan di-assign dg baik.
File I/O (Input) Step 4a: Use fscanf() for input. listnames.c /* Baca tiap nama dan hitung berapa banyak nama dalam file.*/ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) { count++; printf("%d. %s\n", count, name); } printf("\nJumlah nama yg di baca: %d\n", count); return 0; Biasanya di cek jika muncul pembacaan atau assignment error, atau end of input file telah di capai.
File I/O (Output) Step 4b: Pakai fprintf() utk output. listnames2.c #include <stdio.h> #define MAXLEN 100 int main() { FILE *inputfile = NULL; FILE *outfile = NULL; char name[MAXLEN]; int count; float mark; /* Asumsikan"names.lst" berisi daftar nama, buka file utk di baca.*/ inputfile = fopen("names.lst", "r"); if (inputfile == NULL) printf("Error membuka file\n"); return 1; } listnames2.c
File I/O (Output) Step 4b: Pakai fprintf() utk output. listnames2.c /* output file "names_marks.dat" berisi daftar nama dan tanda yang diberikan */ outfile = fopen("names_marks.dat", "w"); if (outfile == NULL) { printf("Error membuka output file\n"); return 1; }
File I/O (Output) Step 4b: Pakai fprintf() utk output. listnames2.c /* Baca tiap nama, berikan tanda, dan tulis name dan tandamark ke output file. Juga hitung ada berapa nama dalam file. */ count = 0; while ( fscanf(inputfile, "%s", name ) == 1 ) { count++; printf(“Masukan tanda untuk %s: ", name); scanf("%f", &mark); if ( fprintf(outfile, "%s %f\n", name, mark) <= 0 ) printf("Error menulis output file\n"); return 1; } /*** etc ***/ listnames2.c
File handler, Bukan nama file File I/O (Output) Step 4b: Pakai fprintf() utk output. listnames2.c /* Baca tiap nama, berikan tanda, dan tulis name dan tandamark ke output file. Juga hitung ada berapa nama dalam file. */ count = 0; while ( fscanf(inputfile, "%s", name ) == 1 ) { count++; printf("Masukan tanda untuk %s: ", name); scanf("%f", &mark); if ( fprintf(outfile, "%s %f\n", name, mark) <= 0 ) printf("Error menulis output file\n"); return 1; } /*** etc ***/ File handler, Bukan nama file
Parameter lainnya: spt printf(). File I/O (Output) Step 4b: Pakai fprintf() utk output. listnames2.c /* Baca tiap nama, berikan tanda, dan tulis name dan tandamark ke output file. Juga hitung ada berapa nama dalam file. */ count = 0; while ( fscanf(inputfile, "%s", name ) == 1 ) { count++; printf("Masukan tanda untuk %s: ", name); scanf("%f", &mark); if ( fprintf(outfile, "%s %f\n", name, mark) <= 0 ) printf("Error menulis output file\n"); return 1; } /*** etc ***/ Parameter lainnya: spt printf().
File I/O (Output) Step 4b: Pakai fprintf() utk output. /* Baca tiap nama, berikan tanda, dan tulis name dan tandamark ke output file. Juga hitung ada berapa nama dalam file. */ count = 0; while ( fscanf(inputfile, "%s", name ) == 1 ) { count++; printf("Masukan tanda untuk %s: ", name); scanf("%f", &mark); if ( fprintf(outfile, "%s %f\n", name, mark) <= 0 ) printf("Error menulis output file\n"); return 1; } /*** etc ***/ fprintf() mengembalikan jmlh characters yg ditulis dg benar , atau negative jika muncul error. listnames2.c
File I/O (Close) Step 5: Close file dg fclose() int main() { /*** etc ***/ printf("\n"); printf("Jumlah nama yg di baca: %d\n", count); fclose(inputfile); fclose(outfile); return 0; }
File handler, bukan tanam file. File I/O (Close) Step 5: Close file dg fclose() int main() { /*** etc ***/ printf("\n"); printf("Jumlah nama yg di baca: %d\n", count); fclose(inputfile); fclose(outfile); return 0; } File handler, bukan tanam file.
File I/O (Close) Step 5: Close file dg fclose() int main() { /*** etc ***/ printf("\n"); printf("Jumlah nama yg di baca: %d\n", count); fclose(inputfile); fclose(outfile); return 0; } Bersihkan input buffer. hapus output buffer. fclose() gagal jika file tidak di buka dg baik .
Catatan pada Filename Jika path dtidak di berikan maka program hanya mencari pada direktory aktif. Path Directory nama file : DOS/Windows sysFile = fopen(“C:\\win\\system.ini”, “r”); Path Directory nama file : Unix/linux passFile = fopen(“/usr/etc/passwd”, “r”);
Catatan pada Filename Variable nama file: FILE *outFile = NULL; char someName[MAX_NAME_LEN]; printf(“Masukan output nama file: ”); scanf(“%s”, someName); outFile = fopen(someName, “w”);
File I/O dan Stream Recall: stream melayani sebagai channel utk mengirimkan karakter antara I/O devices dan program. Standard streams: stdin, stdout, stderr file handler/pointer melayani sbg stream ke/dari file. Sekali item di baca dari input stream, file position bergerak otomatis, dan item selanjutnya (jika ada) mjd item yang selanjutnya di baca ("sequential access").
Catatan pd Strings dan fscanf() Membaca dalam string: fscanf(stream, “%s”, string) Membaca hanya sebuah “kata" saat itu. Kata di pisahkan oleh white-space: (space, tab, newline, atau kombinasinya) Bergerak ke kata selanjutnya scr otomatis setelah pembacaan. scanf(“%s”, string) Sama, kecuali, input stream-nya adalah stdin.
Checking EOF Baik scanf() dan fscanf() mengembalikan: Jmlh input item yg diconvert dan di-assign dg benar. atau nilai konstant EOF saat muncul error atau end-of-file , but... Not recommended! count = 0; while ( fscanf(inputfile, "%s", name) != EOF ) { count++; printf("%d. %s\n", count, name); }
Checking EOF Perhatian! Pakai EOF dengan hati-hati! Dpt menyebabkan masalah jika conversion specifiers tidak sama dengan isi file while ( fscanf(inpf, "%s %f", name, &mark) != EOF ) { printf("%s\t %f\n", name, mark); } listmarks.c inpf: Jake absent Contoh:
Checking EOF Utk menge-check end-of-file (atau input error), check jmlh item/number of items yg di-convert dan di-assign dg baik apakah equal dg jmlh item yang dihrpkan/expected while ( fscanf(inpf, "%s %f", name, &mark) == 2 ) { printf("%s\t %f\n", name, mark); } listmarks.c
Checking EOF Utk menge-check end-of-file (atau input error), check jmlh item/number of items yg di-convert dan di-assign dg baik apakah equal dg jmlh item yang dihrpkan/expected Sama utk scanf(). if ( scanf("%d %d %d", &page, &row, &col) != 3 ) { printf( "I cannot go on without 3 integers :-( \n" ); exit(1); } testscanf1.c
Checking EOF To check for end-of-file (or any other input error), check that the number of items converted and assigned successfully is equal to the expected number of items. Fungsi exit() menyebabkan program berhenti segera. Perlu #include <stdlib.h> if ( scanf("%d %d %d", &page, &row, &col) != 3 ) { printf( "I cannot go on without 3 integers :-( \n" ); exit(1); }
Contoh: Hitung Kata WriTulis program utk menghitung kata dalam file.
Hitung Kata: Algorithm Tanya nama yg di cari user dlm buka file check jika file sukses di buka Hitung jmlh kata dlm file Cetak jumlahnya Tutup file Duh?
Hitung Kata: Algorithm Utk menghitung jmlh kata dalam file: set count to 0 loop { baca kata dari file jika saat membaca kata gagal maka { exit loop } tambahkan 1 ke count } Aku akan melakukannya dg sebuah fungsi
Function: countWords() Prototipe Function: int countWords ( FILE *inpf ); Deskripsi: Fungsi ini mengembalikan jmlh kata dalam input stream inpf.
Function: countWords() PRE-Condition: Diasumsikan bhw inpf adlh pointer ke file yg di buka dg baik. Diasumsikan bhw posisi file berada pad awal input file/stream. Bahwa “kata" berarti tiap string karakter, yg dipisahkan dg whitespace (space, tab, newline, atau kombinasinya). Diasumsikan bhw tidak ada katadlm file yang panjangnya lebih dari (MAXLEN - 1) karakter.
Function: countWords() PRE-Condition: Diasumsikan bhw inpf adlh pointer ke file yg di buka dg baik. Diasumsikan bhw posisi file berada pad awal input file/stream. Bahwa “kata" berarti tiap string karakter, yg dipisahkan dg whitespace (space, tab, newline, atau kombinasinya). Diasumsikan bhw tidak ada katadlm file yang panjangnya lebih dari (MAXLEN - 1) karakter. We will use a #define to set the value of MAXLEN. (See countwords.h)
Function: countWords() POST-Conditions: Pada akhir fungsi, posisi file berada pada end of file. Fungsi mengembalikan nilai integer yaitu jumlah kata dalam file.
Function: countWords() int countWords ( FILE *inpf ) { char word[MAXLEN]; int count = 0; while ( fscanf(inpf, "%s", word) == 1 ) count++; } return count; countwords.c
Count Words: Algorithm Tanyakan user nama file yg akan di buka Buka file check jika file sudah terbuka sukses Hitung jumlah kata dalam file Cetak jumlahnya Tutup file Buat fungsi yg dapat di pakai lagi di sini
Function: openInput() Function prototype: FILE* openInput ( void ); Deskripsi: Fungsi ini tetap menanyakan user mengenai nama file, hinga dapat di buka sebagai inputan.
Function: openInput() PRE-Condition: Diasumsikan nama file cukup dalam ukuran string dari MAXLEN (termasuk '\0').
Function: openInput() POST-Conditions: Program berhenti nila user memilih membatalkan operasi. Kembalikan file handler/pointer utk file yang di tentukan. Diasumsikan pemanggilan fungsi memiliki variabel yang berhubungan utk mendapatkan nilai yang dikembalikan. Juga diasumsikan pemanggilan fungsi juga menangani penutupan file.
countwords.c FILE* openInput ( void ) { FILE *handle = NULL; char theFile[MAXLEN]; int option; while (1) printf("Enter file name: "); scanf("%s", theFile); if ((handle = fopen(theFile, "r")) == NULL ) /*Insert kode utk menangani error pembukaan file */ } else break; return handle;
Code utk menangani error pembukaan file: printf("Error membuka file.\n"); option = 0;/*Set default utk membatalkan.*/ printf("\nKetik 1 utk mencoba lagi, "); printf(“atau angka lain utk membatalkan: "); scanf("%d", &option); printf("\n"); if ( option != 1 ) { printf(“Baik lalu. "); printf("Program Selesai.\n"); exit(1); } countwords.c
Algorithm Utama set file utk menghasilkan openInput() set count utk menghasilkan countWords(file) Cetak jumlah count tutup file
Test Program #1 testcount1.c #include <stdio.h> #include <stdlib.h> #include "countwords.h" #include "countwords.c" int main() { FILE *inputFile = NULL; int count; inputFile = openInput(); count = countWords(inputFile); printf("\nAda %d kata dalam file.\n", count); fclose(inputFile); return 0; } testcount1.c
Test Program #2 #include <stdio.h> #include <stdlib.h> #include "countwords.h" #include "countwords.c" int main() { FILE *inputFile = NULL; int count; inputFile = openInput(); count = countWords(inputFile); printf("\nAda %d kata dalam file.\n", count); fclose(inputFile); return 0; } Apa hslnya jika panggil fungsi countWords() dua kali pd file yg sama? testcount2.c
Fungsi rewind() Kita dapat memakai fungsi rewind(stream) utk me-re-set posisi file pada start/awal input file lagi. Catatan: Pada setiap posisi filekita harus melakukan random access file I/O (tidak di bahas pad kuliah ini).
Test Program #3 testcount3.c #include <stdio.h> #include <stdlib.h> #include "countwords.h" #include "countwords.c" int main() { FILE *inputFile = NULL; int count; inputFile = openInput(); count = countWords(inputFile); printf("\nAda %d kata dalam file\n", count); rewind(inputFile); fclose(inputFile); return 0; } testcount3.c
Fungsi fgets() Utk Membaca baris dr text: fgets(string, size, stream) Membaca sebanyak (size - 1) character dr stream dan menyimpannya ke dalam String. Pembacaan berhenti setelah EOF atau baris baru/ newline. Jika newline/baris baru di baca, fungsi tsb menyimpannya kedalam string. '\0' disimpan setelah karakter terakhir ke dalam string. Mengembalikan NULL (double `L’!) jika error atau eof ketika tidak ada karakter yang di baca lagi
Dpt sbg file pointer (input stream). Fungsi fgets() Dpt sbg file pointer (input stream). Contoh: char name[10]; fgets(name, 10, stdin); input: Hsiu Lin(Enter key) H s i u L n name \n \0
Contoh: Validasi Input #include <stdio.h> #define MAXLEN 256 int main() { int page, row, col; char dummy[MAXLEN]; printf("Masukan 3 angka integer "); while (scanf("%d %d %d", &page, &row, &col) != 3 ) printf( "Tidak berhenti sebelum ada 3 angka integer \n"); fgets(dummy, MAXLEN, stdin); } printf(“Bilangannya: %d %d %d\n", page, row, col); return 0; Dlm contoh ini, fgets() di pakai utk menghapus/"flush" input yang jelek dr buffer stdin testscanf2.c
Kesimpulan Sequential File handling EOF/Error Checking "C vocabulary“ baru: FILE * fopen(), fscanf(), fprint(), fclose() exit() rewind() fgets()