DAPATKAN BARIS SETERUSNYA Projek UNTUK Mempelajari Cara Menangani Deskriptor Fail dan I/O Sistem

Patricia Arquette
Lepaskan: 2024-10-06 22:07:30
asal
574 orang telah melayarinya

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.

Memahami Deskriptor Fail dan I/O dalam Sistem

Apakah Deskriptor Fail?

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.

jadual deskriptor fail

GET NEXT LINE A Project TO Learn How To Deal with File Descriptors and I/O of System

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.

bagaimana untuk membuka fail

contoh

<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>

Salin selepas log masuk



pecahan kod

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.

membaca daripada deskriptor fail

contoh

<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>

Salin selepas log masuk



pecahan

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.

GET NEXT LINE A Project TO Learn How To Deal with File Descriptors and I/O of System

Dalam contoh kami:

  • Panggilan pertama untuk membaca membaca 3 bait pertama daripada fail dan menyimpannya dalam penimbal, bermula pada permulaan fail (offset 0). Offset kemudiannya dikemas kini kepada 3.
  • 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。

參數

  • fd:要讀取的檔案的檔案描述符。
  • BUFFER_SIZE:用於從檔案讀取區塊的緩衝區的大小。 你的程序應該沒有洩漏。

解決方案 :

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!