2008-10-02 12 views
26

मैं एक सी पुस्तकालय लिख रहा हूं जो एक फ़ाइल को स्मृति में पढ़ता है। यह फ़ाइल के पहले 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 "बी" टैग के अस्तित्व का उल्लेख है, लेकिन कहा गया है कि यह "कोई प्रभाव नहीं होगा"।

+0

मैं fopen_s के बाद से माइक्रोसॉफ्ट टैग जोड़ा केवल एमएस के सी RTL में है। – user7116

+0

ओपन ग्रुप इसका उल्लेख करता है: आर या आरबी - पढ़ने के लिए फ़ाइल खोलें। ... चरित्र 'बी' का कोई प्रभाव नहीं होगा, लेकिन आईएसओ सी मानक अनुरूपता के लिए अनुमति है। कृपया अपना संपादन ठीक करें। –

+0

मैंने माइक्रोसॉफ्ट टैग हटा दिया। –

उत्तर

48

शायद यह एक बाइनरी मोड समस्या है। मोड के रूप में फ़ाइल को "r+b" के साथ खोलने का प्रयास करें।

संपादित: के रूप में एक टिप्पणी में उल्लेख किया "rb" संभावना अपने मूल उद्देश्य के लिए एक बेहतर मैच के बाद से "r+b"/पढ़ने के लिए यह खुल जाएगा लिख ​​सकते हैं और "rb" केवल पढ़ने के लिए है।

+0

छद्म +1 (मैं वोटों से बाहर हूं) –

+0

माइक एफ और खुद के लिए +1। विंडोज़ मुझे हर समय + बी के साथ काटता है। – user7116

+0

मैं पहले "आरबी" की कोशिश करने का सुझाव दूंगा, क्योंकि "आर + बी" पढ़ने और लिखने के लिए फ़ाइल फ़ाइल खोलता है, और यदि आप फ़ाइल को लिखने का इरादा नहीं रखते हैं तो आपको इसे केवल पढ़ने के लिए खोलना जारी रखना चाहिए। –

0

भी ध्यान देने योग्य बात है कि बस अपने लिंक आदेश में binmode.obj सहित सभी फ़ाइल को खोलता है आप के लिए यह करना होगा लायक।

-1

एक समाधान, पिछले उत्तरों के आधार:

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; 
} 
संबंधित मुद्दे