Fail C I / O: Membuka, Membaca, Menulis dan Menutup fail

Dalam tutorial ini, anda akan belajar mengenai pengendalian fail di C. Anda akan belajar mengendalikan I / O standard dalam C menggunakan fprintf (), fscanf (), fread (), fwrite (), fseek () dll dengan bantuan contoh.

Fail adalah wadah dalam peranti penyimpanan komputer yang digunakan untuk menyimpan data.

Mengapa fail diperlukan?

  • Apabila program ditamatkan, keseluruhan data akan hilang. Menyimpan dalam fail akan menyimpan data anda walaupun program tersebut berakhir.
  • Sekiranya anda harus memasukkan sebilangan besar data, memerlukan banyak masa untuk memasukkan semuanya.
    Namun, jika anda mempunyai fail yang berisi semua data, anda dapat mengakses isi fail dengan mudah menggunakan beberapa perintah di C.
  • Anda boleh memindahkan data anda dari satu komputer ke komputer yang lain tanpa perubahan.

Jenis Fail

Semasa berurusan dengan fail, terdapat dua jenis fail yang harus anda ketahui:

  1. Fail teks
  2. Fail binari

1. Fail teks

Fail teks adalah fail .txt biasa . Anda boleh membuat fail teks dengan mudah menggunakan penyunting teks ringkas seperti Notepad.

Apabila anda membuka fail tersebut, anda akan melihat semua kandungan di dalam fail itu sebagai teks biasa. Anda boleh mengedit atau memadam kandungannya dengan mudah.

Mereka memerlukan sedikit usaha untuk menjaga, mudah dibaca, dan memberikan keamanan paling sedikit dan memerlukan ruang penyimpanan yang lebih besar.

2. Fail binari

Fail binari kebanyakannya adalah fail .bin di komputer anda.

Daripada menyimpan data dalam teks biasa, mereka menyimpannya dalam bentuk binari (0 dan 1).

Mereka dapat menyimpan jumlah data yang lebih tinggi, tidak mudah dibaca, dan memberikan keselamatan yang lebih baik daripada fail teks.

Operasi Fail

Di C, anda boleh melakukan empat operasi utama pada fail, sama ada teks atau binari:

  1. Membuat fail baru
  2. Membuka fail yang ada
  3. Menutup fail
  4. Membaca dan menulis maklumat ke fail

Bekerja dengan fail

Semasa bekerja dengan fail, anda perlu menyatakan penunjuk jenis fail. Deklarasi ini diperlukan untuk komunikasi antara fail dan program.

 FILE *fptr;

Membuka fail - untuk dibuat dan diedit

Membuka fail dilakukan menggunakan fopen()fungsi yang ditentukan dalam stdio.hfile header.

Sintaks untuk membuka fail dalam I / O standard adalah:

 ptr = fopen("fileopen","mode"); 

Sebagai contoh,

 fopen("E:\cprogram\newprogram.txt","w"); fopen("E:\cprogram\oldprogram.bin","rb");
  • Anggaplah fail newprogram.txttidak ada di lokasi E:cprogram. Fungsi pertama membuat fail baru bernama newprogram.txtdan membukanya untuk menulis mengikut mod 'w' .
    Mod penulisan membolehkan anda membuat dan mengedit (menimpa) kandungan fail.
  • Sekarang mari kita anggap fail binari kedua oldprogram.binada di lokasi E:cprogram. Fungsi kedua membuka fail yang ada untuk dibaca dalam mod binari 'rb' .
    Mod membaca hanya membolehkan anda membaca fail, anda tidak boleh menulis ke dalam fail.
Mod Pembukaan dalam Standard I / O
Mod Makna Mod Semasa Ketiadaan fail
r Dibuka untuk membaca. Sekiranya fail tidak ada, fopen()mengembalikan NULL.
rb Dibuka untuk membaca dalam mod binari. Sekiranya fail tidak ada, fopen()mengembalikan NULL.
w Dibuka untuk penulisan. Sekiranya fail itu ada, kandungannya akan ditimpa.
Sekiranya fail tidak ada, ia akan dibuat.
wb Dibuka untuk menulis dalam mod binari. Sekiranya fail itu ada, kandungannya akan ditimpa.
Sekiranya fail tidak ada, ia akan dibuat.
a Buka untuk dilampirkan.
Data ditambahkan ke hujung fail.
Sekiranya fail tidak ada, ia akan dibuat.
ab Buka untuk dilampirkan dalam mod binari.
Data ditambahkan ke hujung fail.
Sekiranya fail tidak ada, ia akan dibuat.
r+ Dibuka untuk membaca dan menulis. Sekiranya fail tidak ada, fopen()mengembalikan NULL.
rb+ Dibuka untuk membaca dan menulis dalam mod binari. Sekiranya fail tidak ada, fopen()mengembalikan NULL.
w+ Dibuka untuk membaca dan menulis. Sekiranya fail itu ada, kandungannya akan ditimpa.
Sekiranya fail tidak ada, ia akan dibuat.
wb+ Dibuka untuk membaca dan menulis dalam mod binari. Sekiranya fail itu ada, kandungannya akan ditimpa.
Sekiranya fail tidak ada, ia akan dibuat.
a+ Dibuka untuk bacaan dan tambahan. Sekiranya fail tidak ada, ia akan dibuat.
ab+ Dibuka untuk bacaan dan penambahan dalam mod binari. Sekiranya fail tidak ada, ia akan dibuat.

Menutup Fail

Fail (teks dan binari) harus ditutup setelah membaca / menulis.

Penutupan fail dilakukan menggunakan fclose()fungsi.

 fclose(fptr);

Here, fptr is a file pointer associated with the file to be closed.

Reading and writing to a text file

For reading and writing to a text file, we use the functions fprintf() and fscanf().

They are just the file versions of printf() and scanf(). The only difference is that fprint() and fscanf() expects a pointer to the structure FILE.

Example 1: Write to a text file

 #include #include int main() ( int num; FILE *fptr; // use appropriate location if you are using MacOS or Linux fptr = fopen("C:\program.txt","w"); if(fptr == NULL) ( printf("Error!"); exit(1); ) printf("Enter num: "); scanf("%d",&num); fprintf(fptr,"%d",num); fclose(fptr); return 0; ) 

This program takes a number from the user and stores in the file program.txt.

After you compile and run this program, you can see a text file program.txt created in C drive of your computer. When you open the file, you can see the integer you entered.

Example 2: Read from a text file

 #include #include int main() ( int num; FILE *fptr; if ((fptr = fopen("C:\program.txt","r")) == NULL)( printf("Error! opening file"); // Program exits if the file pointer returns NULL. exit(1); ) fscanf(fptr,"%d", &num); printf("Value of n=%d", num); fclose(fptr); return 0; ) 

This program reads the integer present in the program.txt file and prints it onto the screen.

If you successfully created the file from Example 1, running this program will get you the integer you entered.

Other functions like fgetchar(), fputc() etc. can be used in a similar way.

Reading and writing to a binary file

Functions fread() and fwrite() are used for reading from and writing to a file on the disk respectively in case of binary files.

Writing to a binary file

To write into a binary file, you need to use the fwrite() function. The functions take four arguments:

  1. address of data to be written in the disk
  2. size of data to be written in the disk
  3. number of such type of data
  4. pointer to the file where you want to write.
 fwrite(addressData, sizeData, numbersData, pointerToFile);

Example 3: Write to a binary file using fwrite()

 #include #include struct threeNum ( int n1, n2, n3; ); int main() ( int n; struct threeNum num; FILE *fptr; if ((fptr = fopen("C:\program.bin","wb")) == NULL)( printf("Error! opening file"); // Program exits if the file pointer returns NULL. exit(1); ) for(n = 1; n < 5; ++n) ( num.n1 = n; num.n2 = 5*n; num.n3 = 5*n + 1; fwrite(&num, sizeof(struct threeNum), 1, fptr); ) fclose(fptr); return 0; ) 

In this program, we create a new file program.bin in the C drive.

We declare a structure threeNum with three numbers - n1, n2 and n3, and define it in the main function as num.

Now, inside the for loop, we store the value into the file using fwrite().

The first parameter takes the address of num and the second parameter takes the size of the structure threeNum.

Since we're only inserting one instance of num, the third parameter is 1. And, the last parameter *fptr points to the file we're storing the data.

Finally, we close the file.

Reading from a binary file

Function fread() also take 4 arguments similar to the fwrite() function as above.

 fread(addressData, sizeData, numbersData, pointerToFile);

Example 4: Read from a binary file using fread()

 #include #include struct threeNum ( int n1, n2, n3; ); int main() ( int n; struct threeNum num; FILE *fptr; if ((fptr = fopen("C:\program.bin","rb")) == NULL)( printf("Error! opening file"); // Program exits if the file pointer returns NULL. exit(1); ) for(n = 1; n < 5; ++n) ( fread(&num, sizeof(struct threeNum), 1, fptr); printf("n1: %d n2: %d n3: %d", num.n1, num.n2, num.n3); ) fclose(fptr); return 0; ) 

In this program, you read the same file program.bin and loop through the records one by one.

In simple terms, you read one threeNum record of threeNum size from the file pointed by *fptr into the structure num.

You'll get the same records you inserted in Example 3.

Getting data using fseek()

If you have many records inside a file and need to access a record at a specific position, you need to loop through all the records before it to get the record.

This will waste a lot of memory and operation time. An easier way to get to the required data can be achieved using fseek().

As the name suggests, fseek() seeks the cursor to the given record in the file.

Syntax of fseek()

 fseek(FILE * stream, long int offset, int whence);

The first parameter stream is the pointer to the file. The second parameter is the position of the record to be found, and the third parameter specifies the location where the offset starts.

Dari mana yang berbeza di fseek ()
Dari mana Makna
SEEK_SET Memulakan ofset dari awal fail.
SEEK_END Memulakan ofset dari akhir fail.
SEEK_CUR Memulakan ofset dari lokasi kursor semasa dalam fail.

Contoh 5: fseek ()

 #include #include struct threeNum ( int n1, n2, n3; ); int main() ( int n; struct threeNum num; FILE *fptr; if ((fptr = fopen("C:\program.bin","rb")) == NULL)( printf("Error! opening file"); // Program exits if the file pointer returns NULL. exit(1); ) // Moves the cursor to the end of the file fseek(fptr, -sizeof(struct threeNum), SEEK_END); for(n = 1; n < 5; ++n) ( fread(&num, sizeof(struct threeNum), 1, fptr); printf("n1: %d n2: %d n3: %d", num.n1, num.n2, num.n3); fseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR); ) fclose(fptr); return 0; ) 

Program ini akan mula membaca rekod dari fail program.bindalam urutan terbalik (terakhir hingga pertama) dan mencetaknya.

Artikel menarik...