मैं एक सी पुस्तकालय लिख रहा हूं जो एक फ़ाइल को स्मृति में पढ़ता है। यह फ़ाइल के पहले 54 बाइट्स (हेडर) को छोड़ देता है और फिर शेष को डेटा के रूप में पढ़ता है। मैं फ़ाइल की लंबाई निर्धारित करने के लिए fseek का उपयोग करें, और फिर फ़ाइल में पढ़ने के लिए fread का उपयोग करें।ईओएफ की शुरुआत में फ्रेड क्यों पहुंच रहा है?
पाश एक बार चलाता है और उसके बाद समाप्त हो जाती है क्योंकि EOF (कोई त्रुटि) पर पहुंच गया है। अंत में, बाइट्स रीड = 10624, ftell (स्ट्रीम) = 28726, और बफर में 28726 मान हैं। मैं उम्मीद करता हूं कि ईओएफ पहुंचने पर 30,000 बाइट पढ़ने के लिए और फ़ाइल स्थिति 30054 होने की उम्मीद है।
सी मेरी मूल भाषा तो मुझे लगता है मैं एक गूंगा शुरुआत गलती कहीं मिल गया है नहीं है।
कोड इस प्रकार है:
const size_t headerLen = 54;
FILE * stream;
errno_t ferrno = fopen_s(&stream, filename.c_str(), "r");
if(ferrno!=0) {
return -1;
}
fseek(stream, 0L, SEEK_END);
size_t bytesTotal = (size_t)(ftell(stream)) - headerLen; //number of data bytes to read
size_t bytesRead = 0;
BYTE* localBuffer = new BYTE[bytesTotal];
fseek(stream,headerLen,SEEK_SET);
while(!feof(stream) && !ferror(stream)) {
size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-bytesRead,stream);
bytesRead+=result;
}
संदर्भ आप उपयोग पर निर्भर करता है, यह काफी स्पष्ट है कि मोड झंडा करने के लिए एक "बी" जोड़ने जवाब है। हड्डीहेड-बैज के लिए नामांकन की तलाश। :-) दूसरा पैराग्राफ में इसके बारे में
This reference वार्ता, दूसरे वाक्य (हालांकि उनके तालिका में नहीं)।
MSDN आधे रास्ते पेज नीचे तक द्विआधारी झंडा चर्चा नहीं करता।
OpenGroup "बी" टैग के अस्तित्व का उल्लेख है, लेकिन कहा गया है कि यह "कोई प्रभाव नहीं होगा"।
मैं fopen_s के बाद से माइक्रोसॉफ्ट टैग जोड़ा केवल एमएस के सी RTL में है। – user7116
ओपन ग्रुप इसका उल्लेख करता है: आर या आरबी - पढ़ने के लिए फ़ाइल खोलें। ... चरित्र 'बी' का कोई प्रभाव नहीं होगा, लेकिन आईएसओ सी मानक अनुरूपता के लिए अनुमति है। कृपया अपना संपादन ठीक करें। –
मैंने माइक्रोसॉफ्ट टैग हटा दिया। –