Dalam bidang pengaturcaraan C, mengurus input, output dan ingatan dengan berkesan adalah asas. Untuk membantu anda memahami konsep kritikal ini, get_next_line ialah projek di mana anda akan menulis fungsi yang membaca fail baris demi baris menggunakan deskriptor fail. Setiap seruan fungsi membaca baris seterusnya daripada fail, membolehkan anda memproses keseluruhan kandungan fail satu baris pada satu masa.
Penerangan fail ialah integer bukan negatif yang secara unik mengenal pasti fail terbuka dalam sistem. Apabila program membuka fail, sistem pengendalian mengembalikan deskriptor fail yang boleh digunakan untuk merujuk kepada fail tersebut dalam operasi seterusnya, seperti membaca, menulis atau menutup fail. Deskriptor fail ialah abstraksi yang digunakan oleh sistem pengendalian untuk mengurus pelbagai sumber I/O, termasuk fail, soket dan paip.
0, 1 dan 2 (input standard, output standard dan ralat piawai) dalam Proses A adalah bebas dan berasingan daripada deskriptor fail dalam Proses B. Pengasingan ini memastikan operasi fail dalam satu proses tidak mengganggu yang dalam lain.
Setiap deskriptor fail dikaitkan dengan entri jadual deskriptor fail yang mengandungi maklumat penting tentang fail. Ini termasuk laluan fail, kebenaran akses dan offset semasa, yang menjejaki kedudukan dalam fail untuk operasi baca/tulis. Struktur ini membolehkan sistem pengendalian mengurus berbilang fail terbuka dengan cekap dan memastikan akses dan manipulasi data yang betul.
Perhatikan bahawa deskriptor fail 0, 1 dan 2 dikhaskan oleh sistem pengendalian untuk strim standard. Deskriptor fail 0 digunakan untuk input standard (stdin), yang biasanya mewakili input daripada papan kekunci. Deskriptor fail 1 digunakan untuk output standard (stdout), yang mewakili output ke skrin atau terminal. Deskriptor fail 2 digunakan untuk ralat standard (stderr), yang juga mewakili output ke skrin atau terminal tetapi ditujukan khusus untuk mesej ralat. Deskriptor fail terpelihara ini memastikan bahawa operasi input dan output asas boleh diurus secara konsisten merentas program dan persekitaran yang berbeza. Sebarang deskriptor fail yang dikembalikan oleh fungsi terbuka ialah 3 atau lebih tinggi, memastikan ia tidak bercanggah dengan strim standard ini.
<p>'#include <fcntl.h>'<br> '#include <unistd.h>'</p> <p>int fd = open("example.txt", O_RDONLY);<br> if (fd == -1) {<br> perror("Error opening file");<br> return 1;<br> }</p>
Penerangan fail, diwakili sebagai integer, diperoleh menggunakan fungsi terbuka, yang mengambil dua parameter: nama fail (atau laluan) dan bendera yang menentukan kebenaran akses fail. Sebagai contoh, untuk membaca kandungan fail, kami menggunakan bendera O_RDONLY (baca sahaja). Untuk membaca dan menulis, kami menggunakan bendera O_RDWR. Walaupun terdapat banyak bendera yang tersedia, kami hanya akan menggunakan O_RDONLY untuk projek ini. Fungsi terbuka mengembalikan integer bukan negatif, yang merupakan deskriptor fail jika operasi berjaya; jika tidak, ia mengembalikan -1 untuk menunjukkan ralat (anda tidak mempunyai kebenaran untuk mengakses example.txt). Ambil perhatian bahawa fungsi terbuka berada dalam pustaka unistd.h dan bendera kebenaran ditakrifkan dalam fcntl.h.
<p>'#include <fcntl.h>'<br> '#include <unistd.h>'<br> '#include <stdio.h>'<br> '#define BUFFER_SIZE 4'</p> <p>int fd = open("example.txt", O_RDONLY);<br> if (fd == -1) {<br> perror("Error opening file");<br> return 1;<br> }<br> char buffer[BUFFER_SIZE];<br> read(fd, buffer, sizeof(buffer)-1);<br> printf("1st call : %s\n", buffer);<br> // prints the first 3 bytes<br> read(fd, buffer, sizeof(buffer)-1);<br> printf("2nd call : %s\n", buffer);<br> read(fd, buffer, sizeof(buffer)-1);<br> printf("3rd call : %s\n", buffer);<br> read(fd, buffer, sizeof(buffer)-1);<br> printf("4th call : %s\n", buffer);<br> read(fd, buffer, sizeof(buffer)-1);<br> printf("5th call : %s\n", buffer);</p>
hasil kod
Panggilan pertama : HEL
Panggilan kedua : LO
Panggilan ke-3 : WOR
Panggilan ke-4 : LD
Panggilan ke-5 : (null)
Fungsi baca, yang disediakan oleh perpustakaan unistd.h, digunakan untuk membaca data daripada deskriptor fail. Ia memerlukan tiga parameter: deskriptor fail, penimbal untuk menyimpan data yang dibaca dan bilangan bait untuk dibaca daripada fail, fungsi baca mengembalikan bilangan bait yang dibaca daripada fail.
Dalam jadual deskriptor fail, terdapat atribut yang dipanggil offset. Offset menjejaki kedudukan semasa dalam fail. Setiap kali fungsi baca dipanggil, ia membaca data bermula dari offset semasa dan kemudian memajukan offset dengan bilangan bait dibaca. Ini memastikan bahawa bacaan berikutnya diteruskan dari tempat bacaan terakhir dihentikan.
Dalam contoh kami:
Panggilan kedua untuk membaca membaca 3 bait seterusnya bermula dari ofset yang dikemas kini (3), kemudian mengemas kini offset kepada 6.
dan lain-lain ...
Panggilan ke-5 untuk membaca penimbal akan menjadi batal dan membaca mengembalikan 0 yang menunjukkan tamat fail.
此過程將持續進行,直到從檔案中讀取所有資料或發生錯誤。每次讀取後緩衝區都以 null 終止,以確保它可以作為字串列印。
char *get_next_line(int fd) 將檔案的檔案描述子作為參數,並為每次呼叫傳回一行。如果到達檔案末尾,則傳回 NULL。
https://github.com/Its-JoeTheKing/get_next_line
Atas ialah kandungan terperinci DAPATKAN BARIS SETERUSNYA Projek UNTUK Mempelajari Cara Menangani Deskriptor Fail dan I/O Sistem. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!