सरल सवाल है,क्या फ़्रेड फ़ाइल पॉइंटर को स्थानांतरित करता है?
जब मैं fread का उपयोग करें:
fread(ArrayA, sizeof(Reg), sizeBlock, fp);
मेरे फ़ाइल सूचक, fp
आगे ले जाया जाता है?
सरल सवाल है,क्या फ़्रेड फ़ाइल पॉइंटर को स्थानांतरित करता है?
जब मैं fread का उपयोग करें:
fread(ArrayA, sizeof(Reg), sizeBlock, fp);
मेरे फ़ाइल सूचक, fp
आगे ले जाया जाता है?
उत्तर: हां, फ़ाइल सूचक की स्थिति पढ़ने के बाद स्वचालित रूप से अपडेट हो जाती है, ताकि लगातार fread()
फ़ंक्शंस लगातार फ़ाइल रिकॉर्ड पढ़ सकें।
स्पष्टीकरण:fread()
एक ब्लॉक उन्मुख फ़ंक्शन है। मानक प्रोटोटाइप है:
size_t fread(void *ptr,
size_t size,
size_t limit,
FILE *stream);
समारोह पढ़ता से धारा stream
द्वारा की ओर इशारा किया और स्थानों बाइट्स सरणी में पढ़ा ptr
द्वारा की ओर इशारा किया, यह पढ़ने जब निम्नलिखित शर्तों के किसी भी सत्य हैं बंद हो जाएगा:
size
की limit
तत्वों, याfread()
आप fgetc()
जितना नियंत्रण देता है, और एक एकल आई/ओ आपरेशन में एक से अधिक चरित्र को पढ़ने में सक्षम होने का लाभ है। वास्तव में, स्मृति अनुमति, आप पूरी फ़ाइल को सरणी में पढ़ सकते हैं और अपनी सभी प्रोसेसिंग मेमोरी में कर सकते हैं। इसमें महत्वपूर्ण प्रदर्शन फायदे हैं।
fread()
अक्सर फिक्स्ड-लम्बाई डेटा रिकॉर्ड्स को सीधे structs में पढ़ने के लिए उपयोग किया जाता है, लेकिन आप इसे किसी भी फ़ाइल को पढ़ने के लिए उपयोग कर सकते हैं। अधिकांश डिस्क फ़ाइलों को पढ़ने के लिए यह मेरी निजी पसंद है।
हां, कॉलिंग फ़्रेड वास्तव में फ़ाइल सूचक को स्थानांतरित करता है। फ़ाइल पॉइंटर वास्तव में पढ़ने वाले बाइट्स की संख्या से उन्नत होगा। फ्रेड में त्रुटि के मामले में, फ़्रेड कॉल करने के बाद फ़ाइल स्थिति निर्दिष्ट नहीं है।
हां, fp
बाइट्स की कुल मात्रा द्वारा उन्नत किया जाएगा।
आपके मामले में समारोह , fread पढ़ता sizeBlock
वस्तुओं, प्रत्येक sizeof(Reg)
बाइट्स लंबे से धारा fp
द्वारा की ओर इशारा किया, उन्हें ArrayA
द्वारा दिए गए स्थान पर भंडारण।
हाँ, यह करता है। यह आदेश वर्तमान स्थिति को दिखाने के लिए ftell() समारोह से चेक किया जा सकता है (वास्तव में, अब तक पढ़े गए बाइट), एक नज़र ले लो: उत्तर के लिए
int main() {
typedef struct person {
char *nome; int age;
} person;
// write struct to file 2x or more...
FILE *file = fopen(filename, "rb");
person p;
size_t byteslength = sizeof(struct person);
printf("ftell: %ld\n", ftell(file));
fread(&p, byteslength, 1, file);
printf("name: %s | age: %d\n", p.nome, p.idade);
printf("ftell: %ld\n", ftell(file));
fread(&p, byteslength, 1, file);
printf("name: %s | age: %d\n", p.nome, p.idade);
//...
fclose(file);
return 0;
}
आह, धन्यवाद। मैं सोच रहा था कि फाइल पॉइंटर को दोबारा बदलने के लिए fseek का उपयोग करना होगा। – Richard
यह उत्तर वास्तव में उस प्रश्न को संबोधित नहीं करता है जो पूछा गया था कि फ़ाइल सूचक के साथ क्या होता है, जो कि मेरी समझ के अनुसार –
पर कॉल करने के बाद होता है, उसने स्पष्टता के लिए पूछा कि यह क्यों हो रहा है ..... – Addicted