Fayl ko'rsatgichlari va buferlarni aniqlash

Why, in C, do you need a separate buffer to read a FILE *? When you declare a FILE * and assign to it with fopen, does the file then not exist in contiguous memory starting at the address of said pointer? I'm struggling to make the connection as to why you need need to read via fread() into a separate buffer. If someone could explain how theFIlE *file = fopen(filename, "r") and the subsequent fread(&buffer,...) work in conjunction it would help my understanding tremendously. Thanks in advance.

0
Yo'q, fayl juda oz bo'lsa, xotirada mavjud emas. FILE * , boshqa narsalar bilan bir qatorda, faylni diskdan syscalls orqali o'qish uchun ruxsat beruvchi fayl identifikatorini ushlab turuvchi tizimdir. Bundan tashqari, open() , read() va write() dan foydalanib, to'g'ridan-to'g'ri syscalls yordamida faylni o'qishingiz mumkin, ammo to'g'ridan-to'g'ri syscalls o'qish/yozishni buferlashdan samarali foydalanishga yo'l qo'ymaydi.
qo'shib qo'ydi muallif Havenard, manba
Yo'q, fayl juda oz bo'lsa, xotirada mavjud emas. FILE * , boshqa narsalar bilan bir qatorda, faylni diskdan syscalls orqali o'qish uchun ruxsat beruvchi fayl identifikatorini ushlab turuvchi tizimdir. Bundan tashqari, open() , read() va write() dan foydalanib, to'g'ridan-to'g'ri syscalls yordamida faylni o'qishingiz mumkin, ammo to'g'ridan-to'g'ri syscalls o'qish/yozishni buferlashdan samarali foydalanishga yo'l qo'ymaydi.
qo'shib qo'ydi muallif Havenard, manba
Quyidagi javobni ko'rib chiqaylik, nima uchun «nega» sababini tushunishga yordam berishi mumkin?
qo'shib qo'ydi muallif eRaisedToX, manba

7 javoblar

fopen tomonidan qaytarilgan FILE * keraksiz, lekin foydali, indirection ko'rsatadi.

Nazariy jihatdan, fopen butun faylni xotirada tamponga o'qish uchun yaratilgan bo'lishi mumkin va faqat siz buferni qaytarib olasiz.

Muammoning yondashuvi, u moslashuvchan emas. Siz barcha fayllarni barcha fayllarni o'qish uchun majburiy, ya'ni juda keraksiz. Misol uchun, ba'zi muammolar kelib chiqadi:

  • RAMga moslash uchun juda katta faylni qanday o'qiysiz?
  • Agar faylning oxirida (masalan, jurnalga yozish uchun) yangi satr qo'shishni xohlasangiz nima bo'ladi. Barcha faylni o'qib chiqing, satrni oxirigacha qo'shib qo'ying, keyin butun faylni qayta yozing. Qimmat!
  • Agar siz faqat faylning kichik qismini o'qishni xohlasangiz, masalan, sehrli raqam , uning haqiqiy mazmuniga qaramasdan fayl turini aniqlash uchun?
  • Bir vaqtning o'zida bir nechta dasturlardan faylni tahrir qilishni xohlasangiz. Har bir dastur doimo dolzarb turishini ta'minlash uchun butun faylni xotiraga qayta o'qib chiqishi kerak

fopen returns a file handle that identifies a file still on disk. How much you read out of this file into memory is entirely up to you.

2
qo'shib qo'ydi

fopen tomonidan qaytarilgan FILE * keraksiz, lekin foydali, indirection ko'rsatadi.

Nazariy jihatdan, fopen butun faylni xotirada tamponga o'qish uchun yaratilgan bo'lishi mumkin va faqat siz buferni qaytarib olasiz.

Muammoning yondashuvi, u moslashuvchan emas. Siz barcha fayllarni barcha fayllarni o'qish uchun majburiy, ya'ni juda keraksiz. Misol uchun, ba'zi muammolar kelib chiqadi:

  • RAMga moslash uchun juda katta faylni qanday o'qiysiz?
  • Agar faylning oxirida (masalan, jurnalga yozish uchun) yangi satr qo'shishni xohlasangiz nima bo'ladi. Barcha faylni o'qib chiqing, satrni oxirigacha qo'shib qo'ying, keyin butun faylni qayta yozing. Qimmat!
  • Agar siz faqat faylning kichik qismini o'qishni xohlasangiz, masalan, sehrli raqam , uning haqiqiy mazmuniga qaramasdan fayl turini aniqlash uchun?
  • Bir vaqtning o'zida bir nechta dasturlardan faylni tahrir qilishni xohlasangiz. Har bir dastur doimo dolzarb turishini ta'minlash uchun butun faylni xotiraga qayta o'qib chiqishi kerak

fopen returns a file handle that identifies a file still on disk. How much you read out of this file into memory is entirely up to you.

2
qo'shib qo'ydi

Nima uchun C da, FILE * ni o'qish uchun alohida bufer kerakmi?

Odatda I/O'ni tezlashtirish uchun hech qanday bufer kerak emas.

Agar FILE * deb e'lon qilsangiz va uni fopen bilan belgilasangiz, faylni ishlating   so'ngra keltirilgan manzilda boshlangan ulashgan xotirada mavjud emas   

Albatta, buning hech qanday samarasi yo'q (nima uchun oxir-oqibat kerak bo'lmasa, barcha fayllarni katta hajmda o'qish kerak) va eng yomoni, umuman mumkin emas (RAM hajmi odatda DISK hajmidan kamroq).

If someone could explain how the FILE *file = fopen(filename, "r") and the subsequent fread(&buffer,...) work in conjunction it would help my understanding tremendously.

Keyin FILE * fayl ma'lumotlarini o'z ichiga olgan xotira ob'ektiga qarash emas, lekin diskdagi fayl ma'lumotlariga kirishga yordam berish uchun ma'lumotlarni o'z ichiga olgan xotira obyekti. Ushbu shaffof ob'ekt (shaffof narsalar ichki tafsilotlarni ko'rishga urinmaydi), masalan, joriy ofsetni o'z ichiga oladi (buni o'qiganingizda yoki yozganingizda esingizdan chetga surib qo'ying va bu offsetni mos ravishda o'zgartiradi), yoki ochiq rejim (bu bilan o'qish uchun ochilgan faylga yozilish to'g'ri bajarilmaydi) yoki ba'zi bir bufer (faylning bir qismini va ba'zan butun faylni o'z ichiga olishi mumkin!) va boshqalar. * FILE * eshik uchun dastani vazifasini bajaradi. Faylni va FILE * ni aralashtirib yubormang, birinchi siz allaqachon ma'lum bo'lgan ma'lumotni (ma'lumotlar diskida) quchoqlashning umumiy atamasi, keyin ikkinchisi esa ochilgan fayl ni ifodalovchi dinamik ob'ekt bo'lgan berilgan faylni manipulyatsiya qilishni anglatadi.

Nima uchun o'qish kerakligi haqida aloqani o'rnatish uchun kurashmoqdaman   fread() orqali alohida buferga kiritilgan.

Xotirada faylingiz yo'q yoki bo'lmasa, siz qiziqayotgan qismni o'qishni so'rashingiz kerak.

0
qo'shib qo'ydi

Nima uchun C da, FILE * ni o'qish uchun alohida bufer kerakmi?

Odatda I/O'ni tezlashtirish uchun hech qanday bufer kerak emas.

Agar FILE * deb e'lon qilsangiz va uni fopen bilan belgilasangiz, faylni ishlating   so'ngra keltirilgan manzilda boshlangan ulashgan xotirada mavjud emas   

Albatta, buning hech qanday samarasi yo'q (nima uchun oxir-oqibat kerak bo'lmasa, barcha fayllarni katta hajmda o'qish kerak) va eng yomoni, umuman mumkin emas (RAM hajmi odatda DISK hajmidan kamroq).

If someone could explain how the FILE *file = fopen(filename, "r") and the subsequent fread(&buffer,...) work in conjunction it would help my understanding tremendously.

Keyin FILE * fayl ma'lumotlarini o'z ichiga olgan xotira ob'ektiga qarash emas, lekin diskdagi fayl ma'lumotlariga kirishga yordam berish uchun ma'lumotlarni o'z ichiga olgan xotira obyekti. Ushbu shaffof ob'ekt (shaffof narsalar ichki tafsilotlarni ko'rishga urinmaydi), masalan, joriy ofsetni o'z ichiga oladi (buni o'qiganingizda yoki yozganingizda esingizdan chetga surib qo'ying va bu offsetni mos ravishda o'zgartiradi), yoki ochiq rejim (bu bilan o'qish uchun ochilgan faylga yozilish to'g'ri bajarilmaydi) yoki ba'zi bir bufer (faylning bir qismini va ba'zan butun faylni o'z ichiga olishi mumkin!) va boshqalar. * FILE * eshik uchun dastani vazifasini bajaradi. Faylni va FILE * ni aralashtirib yubormang, birinchi siz allaqachon ma'lum bo'lgan ma'lumotni (ma'lumotlar diskida) quchoqlashning umumiy atamasi, keyin ikkinchisi esa ochilgan fayl ni ifodalovchi dinamik ob'ekt bo'lgan berilgan faylni manipulyatsiya qilishni anglatadi.

Nima uchun o'qish kerakligi haqida aloqani o'rnatish uchun kurashmoqdaman   fread() orqali alohida buferga kiritilgan.

Xotirada faylingiz yo'q yoki bo'lmasa, siz qiziqayotgan qismni o'qishni so'rashingiz kerak.

0
qo'shib qo'ydi

Nima uchun C da, FILE * ni o'qish uchun alohida bufer kerakmi?

Odatda I/O'ni tezlashtirish uchun hech qanday bufer kerak emas.

Agar FILE * deb e'lon qilsangiz va uni fopen bilan belgilasangiz, faylni ishlating   so'ngra keltirilgan manzilda boshlangan ulashgan xotirada mavjud emas   

Albatta, buning hech qanday samarasi yo'q (nima uchun oxir-oqibat kerak bo'lmasa, barcha fayllarni katta hajmda o'qish kerak) va eng yomoni, umuman mumkin emas (RAM hajmi odatda DISK hajmidan kamroq).

If someone could explain how the FILE *file = fopen(filename, "r") and the subsequent fread(&buffer,...) work in conjunction it would help my understanding tremendously.

Keyin FILE * fayl ma'lumotlarini o'z ichiga olgan xotira ob'ektiga qarash emas, lekin diskdagi fayl ma'lumotlariga kirishga yordam berish uchun ma'lumotlarni o'z ichiga olgan xotira obyekti. Ushbu shaffof ob'ekt (shaffof narsalar ichki tafsilotlarni ko'rishga urinmaydi), masalan, joriy ofsetni o'z ichiga oladi (buni o'qiganingizda yoki yozganingizda esingizdan chetga surib qo'ying va bu offsetni mos ravishda o'zgartiradi), yoki ochiq rejim (bu bilan o'qish uchun ochilgan faylga yozilish to'g'ri bajarilmaydi) yoki ba'zi bir bufer (faylning bir qismini va ba'zan butun faylni o'z ichiga olishi mumkin!) va boshqalar. * FILE * eshik uchun dastani vazifasini bajaradi. Faylni va FILE * ni aralashtirib yubormang, birinchi siz allaqachon ma'lum bo'lgan ma'lumotni (ma'lumotlar diskida) quchoqlashning umumiy atamasi, keyin ikkinchisi esa ochilgan fayl ni ifodalovchi dinamik ob'ekt bo'lgan berilgan faylni manipulyatsiya qilishni anglatadi.

Nima uchun o'qish kerakligi haqida aloqani o'rnatish uchun kurashmoqdaman   fread() orqali alohida buferga kiritilgan.

Xotirada faylingiz yo'q yoki bo'lmasa, siz qiziqayotgan qismni o'qishni so'rashingiz kerak.

0
qo'shib qo'ydi

Yuqorida keltirilgan tushuntirish juda ko'p o'z-o'zidan tushuntirishga ega, men hali ham soddalashtirmoqchi bo'laman (agar kimdir bu muammoni tushunib olsa)

Qisqa qilib aytganda, bu misolni ko'rib chiqing va siz nima uchun «nima uchun bilasiz?»

1) fayllaringiz juda katta bo'lishi mumkin va qattiq diskda saqlanadi, keyin uni tez-tez o'qib chiqsangiz, bu butun faylni qayta va qayta tiklash uchun qo'shimcha xarajat deb hisoblamang.

2) Va bundan ham yomoni, bu fayl katta bo'lsa, agar faylni to'liq yuklasangiz, u ham bir vaqtning o'zida butun faylga kerak bo'lmasa, sizning RAMni ishlatadi.

Nima uchun C da, FILE * ni o'qish uchun alohida bufer kerakmi?

Birinchidan, chunki buferlarni o'qish va keyin uni ishlatish tezroq bo'ladi.

fayl, keyinchalik boshlangan ulashgan xotirada mavjud emas   nomerning manzili?

May yoki may oyi uning o'lchamiga qarab bo'lmaydi.

If someone could explain how theFIlE *file = fopen(filename, "r") and the subsequent fread(&buffer,...) work in conjunction

Fopen() funktsiyasi faylni ochish uchun ishlatiladi va I/U oqimi bilan bog'lanadi. Bu funktsiya ikki argumentni oladi. Birinchi dalillar ochiladigan fayl nomini o'z ichiga olgan mag'lubiyatga ko'rsatgich bo'lib, ikkincha argument esa fayl ochilishi rejimi.

Turli rejimlar r, r +, w, w +, a, a + kabi bo'lishi mumkin.

Fopen() funktsiyasi, muvaffaqiyatsiz bo'lsa, NULL qaytarilganda muvaffaqiyatga FILE oqim ko'rsatgichini qaytaradi.

Batafsil ma'lumot uchun bu yerda"> bu yerda .

0
qo'shib qo'ydi

Yuqorida keltirilgan tushuntirish juda ko'p o'z-o'zidan tushuntirishga ega, men hali ham soddalashtirmoqchi bo'laman (agar kimdir bu muammoni tushunib olsa)

Qisqa qilib aytganda, bu misolni ko'rib chiqing va siz nima uchun «nima uchun bilasiz?»

1) fayllaringiz juda katta bo'lishi mumkin va qattiq diskda saqlanadi, keyin uni tez-tez o'qib chiqsangiz, bu butun faylni qayta va qayta tiklash uchun qo'shimcha xarajat deb hisoblamang.

2) Va bundan ham yomoni, bu fayl katta bo'lsa, agar faylni to'liq yuklasangiz, u ham bir vaqtning o'zida butun faylga kerak bo'lmasa, sizning RAMni ishlatadi.

Nima uchun C da, FILE * ni o'qish uchun alohida bufer kerakmi?

Birinchidan, chunki buferlarni o'qish va keyin uni ishlatish tezroq bo'ladi.

fayl, keyinchalik boshlangan ulashgan xotirada mavjud emas   nomerning manzili?

May yoki may oyi uning o'lchamiga qarab bo'lmaydi.

If someone could explain how theFIlE *file = fopen(filename, "r") and the subsequent fread(&buffer,...) work in conjunction

Fopen() funktsiyasi faylni ochish uchun ishlatiladi va I/U oqimi bilan bog'lanadi. Bu funktsiya ikki argumentni oladi. Birinchi dalillar ochiladigan fayl nomini o'z ichiga olgan mag'lubiyatga ko'rsatgich bo'lib, ikkincha argument esa fayl ochilishi rejimi.

Turli rejimlar r, r +, w, w +, a, a + kabi bo'lishi mumkin.

Fopen() funktsiyasi, muvaffaqiyatsiz bo'lsa, NULL qaytarilganda muvaffaqiyatga FILE oqim ko'rsatgichini qaytaradi.

Batafsil ma'lumot uchun bu yerda"> bu yerda .

0
qo'shib qo'ydi