C fail membaca dan menulis


Dalam bab sebelumnya kami menerangkan peranti input dan output standard untuk pemprosesan bahasa C. Dalam bab ini kami akan memperkenalkan cara pengaturcara C mencipta, membuka dan menutup teks atau fail binari.

Fail, sama ada fail teks atau fail binari, mewakili satu siri bait. Bahasa C bukan sahaja menyediakan fungsi peringkat atas untuk diakses, tetapi juga menyediakan panggilan peringkat rendah (OS) untuk memproses fail pada peranti storan. Bab ini akan menerangkan panggilan penting pengurusan fail.

Buka fail

Anda boleh menggunakan fungsi fopen( ) untuk mencipta fail baharu atau membuka fail sedia ada. Panggilan ini akan memulakan jenis< An objek 🎜>FAIL jenis FAIL mengandungi semua maklumat yang diperlukan untuk mengawal aliran. Berikut ialah prototaip panggilan fungsi ini:

FILE *fopen( const char * filename, const char * mode );

Di sini,

nama fail ialah rentetan yang digunakan untuk menamakan fail dan nilai mod akses mod boleh menjadi salah satu daripada nilai berikut Salah satu daripada:

Jika anda sedang memproses fail binari, anda perlu menggunakan mod akses berikut dan bukannya mod akses di atas:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

Tutup fail

Untuk menutup fail, gunakan fungsi fclose() . Prototaip fungsi adalah seperti berikut:

 int fclose( FILE *fp );

Jika fail berjaya ditutup, fungsi fclose( ) mengembalikan sifar Jika ralat berlaku semasa menutup fail, fungsi mengembalikan EOF. Fungsi ini sebenarnya mengosongkan data dalam penimbal, menutup fail dan membebaskan semua memori yang digunakan untuk fail. EOF ialah pemalar yang ditakrifkan dalam fail pengepala stdio.h.

Pustaka standard C menyediakan pelbagai fungsi untuk membaca dan menulis fail aksara mengikut aksara atau sebagai rentetan panjang tetap.

Tulis ke fail

Berikut ialah fungsi paling mudah untuk menulis aksara ke strim:

int fputc( int c, FILE *fp );

Fungsifputc() Letakkan parameter c The nilai aksara ditulis pada aliran keluaran yang ditunjuk oleh fp. Ia mengembalikan aksara yang ditulis jika penulisan itu berjaya, atau EOF jika ralat berlaku. Anda boleh menggunakan fungsi berikut untuk menulis rentetan yang ditamatkan nol ke strim:

int fputs( const char *s, FILE *fp );

function fputs() menulis rentetan s ke dalam aliran output yang ditunjuk ke oleh fp. Ia mengembalikan nilai bukan negatif jika penulisan berjaya, atau EOF jika ralat berlaku. Anda juga boleh menggunakan fungsi int fprintf(FILE *fp,const char *format, ...) untuk menulis rentetan pada fail. Cuba contoh berikut:

Nota: Sila pastikan anda mempunyai direktori /tmp yang tersedia, jika ia tidak wujud, anda perlu menciptanya pada komputer anda mula-mula direktori.

#include <stdio.h>main(){
   FILE *fp;

   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);}

Apabila kod di atas disusun dan dilaksanakan, ia mencipta fail baharu test.txt dalam direktori /tmp dan menulis dua baris menggunakan dua fungsi berbeza . Seterusnya mari kita baca fail ini.

Baca fail

Berikut ialah fungsi paling mudah untuk membaca satu aksara daripada fail:

int fgetc( FILE * fp );

fgetc() Fungsi menghala ke dari fp Baca aksara daripada fail input. Nilai pulangan ialah aksara yang dibaca atau EOF jika ralat berlaku. Fungsi berikut membolehkan anda membaca rentetan daripada aliran:

char *fgets( char *buf, int n, FILE *fp );

Fungsi fgets() Membaca n - 1 aksara daripada aliran input yang ditunjuk oleh fp. Ia menyalin rentetan baca ke dalam penimbal buf dan menambahkan aksara null pada penghujung untuk menamatkan rentetan.

Jika fungsi ini menemui aksara baris baharu 'n' atau EOF hujung fail sebelum membaca aksara terakhir, hanya aksara yang dibaca, termasuk aksara baris baharu, dikembalikan. Anda juga boleh menggunakan fungsi int fscanf(FILE *fp, const char *format, ...) untuk membaca rentetan daripada fail, tetapi ia berhenti apabila ia menemui aksara ruang pertama Baca.

#include <stdio.h>main(){
   FILE *fp;   char buff[255];

   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);}

Apabila kod di atas disusun dan dilaksanakan, ia membaca fail yang dibuat dalam bahagian sebelumnya, menghasilkan keputusan berikut:

1 : This2: is testing for fprintf...3: This is testing for fputs...

Pertama, kaedah fscanf() hanya membaca Ini kerana ia menemui ruang selepasnya. Kedua, panggil fgets() untuk membaca baki sehingga akhir baris. Akhir sekali, panggil fgets() untuk membaca baris kedua sepenuhnya.

Fungsi I/O Binari

Dua fungsi berikut digunakan untuk input dan output binari:

size_t fread(void *ptr, size_t size_of_elements, 
             size_t number_of_elements, FILE *a_file);              size_t fwrite(const void *ptr, size_t size_of_elements, 
             size_t number_of_elements, FILE *a_file);

Kedua-dua fungsi digunakan untuk blok storan membaca dan menulis - biasanya Merupakan tatasusunan atau struktur.