Penanganan File di C - Cara Membuka, Menutup, dan Menulis ke File

Jika Anda pernah menulis helloworldprogram C sebelumnya, Anda sudah tahu file dasar I / O di C:

/* A simple hello world in C. */ #include  // Import IO functions. #include  int main() { // This printf is where all the file IO magic happens! // How exciting! printf("Hello, world!\n"); return EXIT_SUCCESS; }

Penanganan file adalah salah satu bagian terpenting dari pemrograman. Di C, kami menggunakan penunjuk struktur dari tipe file untuk mendeklarasikan file:

FILE *fp;

C menyediakan sejumlah fungsi bawaan untuk melakukan operasi file dasar:

  • fopen() - buat file baru atau buka file yang sudah ada
  • fclose() - tutup file
  • getc() - membaca karakter dari file
  • putc() - menulis karakter ke file
  • fscanf() - membaca sekumpulan data dari file
  • fprintf() - menulis sekumpulan data ke file
  • getw() - membaca integer dari file
  • putw() - menulis integer ke file
  • fseek() - atur posisi ke titik keinginan
  • ftell() - memberikan posisi saat ini dalam file
  • rewind() - atur posisi ke titik awal

Membuka file

The fopen()Fungsi digunakan untuk membuat file atau membuka file yang sudah ada:

fp = fopen(const char filename,const char mode);

Ada banyak mode untuk membuka file:

  • r - buka file dalam mode baca
  • w - membuka atau membuat file teks dalam mode tulis
  • a - membuka file dalam mode append
  • r+ - membuka file dalam mode baca dan tulis
  • a+ - membuka file dalam mode baca dan tulis
  • w+ - membuka file dalam mode baca dan tulis

Berikut adalah contoh membaca data dari file dan menulisnya:

#include #include main() { FILE *fp; char ch; fp = fopen("hello.txt", "w"); printf("Enter data"); while( (ch = getchar()) != EOF) { putc(ch,fp); } fclose(fp); fp = fopen("hello.txt", "r"); while( (ch = getc(fp)! = EOF) printf("%c",ch); fclose(fp); }

Sekarang Anda mungkin berpikir, "Ini baru saja mencetak teks ke layar. Bagaimana file IO ini?”

Jawabannya tidak jelas pada awalnya, dan membutuhkan pemahaman tentang sistem UNIX. Dalam sistem UNIX, semuanya diperlakukan sebagai file, artinya Anda dapat membaca dan menulis padanya.

Ini berarti printer Anda dapat diabstraksi sebagai file karena yang Anda lakukan dengan printer hanyalah menulis dengannya. Juga berguna untuk menganggap file-file ini sebagai aliran, karena seperti yang akan Anda lihat nanti, Anda dapat mengarahkannya dengan shell.

Jadi bagaimana ini berhubungan dengan helloworlddan mengajukan IO?

Saat Anda menelepon printf, Anda sebenarnya hanya menulis ke file khusus yang disebut stdout, singkatan dari output standar . stdoutmewakili keluaran standar yang ditentukan oleh shell Anda, yang biasanya merupakan terminal. Ini menjelaskan mengapa itu dicetak ke layar Anda.

Ada dua aliran lain (yaitu file) yang tersedia untuk Anda dengan usaha, stdindan stderr. stdinmewakili input standar , yang biasanya ditempelkan shell Anda ke keyboard. stderrmewakili keluaran kesalahan standar , yang biasanya dipasang oleh shell Anda ke terminal.

File IO yang belum sempurna, atau Bagaimana Saya Belajar untuk Meletakkan Pipa

Cukup teori, mari kita mulai bisnis dengan menulis beberapa kode! Cara termudah untuk menulis ke file adalah dengan mengarahkan aliran keluaran menggunakan alat pengalihan keluaran >,.

Jika Anda ingin menambahkan, Anda dapat menggunakan >>:

# This will output to the screen... ./helloworld # ...but this will write to a file! ./helloworld > hello.txt

Isi dari hello.txtwasiat, tidak mengherankan, adalah

Hello, world!

Katakanlah kita memiliki program lain yang disebut greet, mirip dengan helloworld, yang menyambut Anda dengan name:

#include  #include  int main() { // Initialize an array to hold the name. char name[20]; // Read a string and save it to name. scanf("%s", name); // Print the greeting. printf("Hello, %s!", name); return EXIT_SUCCESS; }

Alih-alih membaca dari keyboard, kita dapat mengarahkan stdinuntuk membaca dari file menggunakan <alat:

# Write a file containing a name. echo Kamala > name.txt # This will read the name from the file and print out the greeting to the screen. ./greet  Hello, Kamala! # If you wanted to also write the greeting to a file, you could do so using ">".

Catatan: operator pengalihan ini ada di dalam bashdan shell serupa.

Kesepakatan Nyata

Metode di atas hanya bekerja untuk kasus paling dasar. Jika Anda ingin melakukan hal-hal yang lebih besar dan lebih baik, Anda mungkin ingin bekerja dengan file dari dalam C alih-alih melalui shell.

Untuk mencapai ini, Anda akan menggunakan fungsi yang disebut fopen. Fungsi ini mengambil dua parameter string, yang pertama adalah nama file dan yang kedua adalah mode.

Mode ini pada dasarnya adalah izin, jadi runtuk membaca, wuntuk menulis, auntuk menambahkan. Anda juga dapat menggabungkannya, sehingga rwberarti Anda dapat membaca dan menulis ke file. Ada lebih banyak mode, tetapi ini yang paling umum digunakan.

Setelah Anda memiliki FILEpointer, pada dasarnya Anda dapat menggunakan perintah IO yang sama dengan yang akan Anda gunakan, kecuali Anda harus mengawalinya fdan argumen pertama adalah file pointer. Misalnya, printfversi file adalah fprintf.

Berikut adalah program bernama greetingsyang membaca a dari file yang berisi daftar nama dan menulis salam ke file lain:

#include  #include  int main() { // Create file pointers. FILE *names = fopen("names.txt", "r"); FILE *greet = fopen("greet.txt", "w"); // Check that everything is OK. if (!names || !greet) { fprintf(stderr, "File opening failed!\n"); return EXIT_FAILURE; } // Greetings time! char name[20]; // Basically keep on reading untill there's nothing left. while (fscanf(names, "%s\n", name) > 0) { fprintf(greet, "Hello, %s!\n", name); } // When reached the end, print a message to the terminal to inform the user. if (feof(names)) { printf("Greetings are done!\n"); } return EXIT_SUCCESS; }

Misalkan names.txtberisi yang berikut:

Kamala Logan Carol

Kemudian setelah dijalankan greetingsfile tersebut greet.txtakan berisi:

Hello, Kamala! Hello, Logan! Hello, Carol!