2011-08-25 17 views
6

मेरा आवेदन (सी प्रोग्राम) एक ही फ़ाइल में दो फ़ाइल हैंडल खोलता है (एक लिखने में और एक पढ़ने मोड में)। ऐप में दो अलग-अलग धागे फ़ाइल से पढ़ते हैं और लिखते हैं। यह ठीक काम करता है। चूंकि मेरा ऐप सीमित रैम डिस्क आकार के साथ एम्बेडेड डिवाइस पर चलता है, इसलिए मैं अधिकतम आकार तक पहुंचने के लिए फ़ाइल की शुरुआत में लपेटने के लिए FileHandle लिखना चाहता हूं और सर्कुलर बफर की तरह अनुसरण करने के लिए FileHandle पढ़ना चाहता हूं। मैं this question के उत्तरों से समझता हूं कि यह काम करना चाहिए। हालांकि जैसे ही मैं फ़ाइल की शुरुआत के लिए FileHandle लिखने के fseek लिखता हूं, fread त्रुटि देता है। EOF फ़ाइल की शुरुआत के लिए fseek करने पर रीसेट हो जाएगा? यदि ऐसा है, तो रीसेट करने के लिए EOF के बिना लिखने के लिए फ़ाइल फ़ाइल स्थिति 0 पर सेट करने के लिए कौन सा फ़ंक्शन उपयोग किया जाना चाहिए।फ़ाइल का उपयोग कर गोलाकार बफर को कैसे कार्यान्वित करें?

संपादित करें/अद्यतन: मैं चीजों की जोड़ी की कोशिश की:


  1. पर @neodelphi मैं पाइप यह काम करता है के लिए इस्तेमाल किया आधार पर। हालांकि मेरे उपयोग के लिए मुझे एक फाइल लिखना आवश्यक है। मुझे लाइव वीडियो निगरानी धारा के कई चैनल प्राप्त होते हैं जिन्हें हार्डडिस्क में संग्रहीत करने की आवश्यकता होती है और डीकोडेड और मॉनीटर पर प्रदर्शित भी पढ़ा जाता है।

  2. ftell करने पर @ क्लेमेंट सुझावों के लिए धन्यवाद मैंने अपने कोड में कुछ कीड़े तय की हैं और पाठक के लिए काम लपेटें हैं, हालांकि, डेटा पढ़ना अभी भी खराब डेटा प्रतीत होता है क्योंकि लेखन अभी भी buffered है लेकिन पाठक कठोर सामग्री को हार्ड से पढ़ता है डिस्क। मैं प्रदर्शन विचारों के कारण बफरिंग से बच नहीं सकता (मुझे 32 एमबीपीएस लाइव डेटा मिलता है जिसे हार्डडिस्क में लिखा जाना चाहिए)। मैंने फ्लशिंग जैसी चीजों को केवल अंतराल में लिखने की कोशिश की है जब लपेटें और लपेटने के बाद फ़ाइल (ftruncate) को छीनने के दौरान लपेटें, लेकिन इससे पुरानी डेटा समस्या हल नहीं होती है।

  3. मैं पिंगपांग फैशन में दो फ़ाइलों का उपयोग करने के लिए यदि इस मुद्दे को हल करती है देखने के लिए कोशिश कर रहा हूँ, लेकिन अगर वहाँ एक बेहतर समाधान

+0

क्या आप फ़ाइल को पढ़ने के दौरान लॉक कर रहे हैं? –

+1

यदि आप लिनक्स जैसी प्रणाली पर विकास कर रहे हैं, तो क्या आपने पाइप फाइलों की कोशिश की? इस तरह की फाइलें केवल लिखी गई हैं जो लिखी गई हैं लेकिन पढ़ी नहीं गई हैं, इसलिए एक गोलाकार बफर को लागू करना आवश्यक नहीं हो सकता है। – neodelphi

+0

@ क्लेमेंट। मेरे पास कोई ताला नहीं है। मैं std c lib fread और fwrite कॉल का उपयोग करता हूं – Badri

उत्तर

1

आप ऐसा ही कुछ होना चाहिए जानना चाहता हूँ:

// Write 
if(ftell(WriteHandle)>BUFFER_MAX) rewind (WriteHandle); 
fwrite(WriteHandle,/* ... */); 

// Read (assuming binary) 
readSize = fread (buffer,1,READ_CHUNK_SIZE,ReadHandle); 
if(readSize!=READ_CHUNK_SIZE){ 
    rewind (ReadHandle); 
    if(fread (buffer+readSize,1,READ_CHUNK_SIZE-readSize,ReadHandle)!=READ_CHUNK_SIZE-readSize) 
     ;// ERROR ! 
} 

परीक्षण नहीं किया गया है, लेकिन यह एक विचार देता है। लिखने के मामले को BUFFER_MAX को भी संभालना चाहिए मॉड्यूल WRITE_CHUNK_SIZE नहीं है।

इसके अलावा, आप केवल तभी पढ़ सकते हैं यदि आप सुनिश्चित हैं कि डेटा पहले ही लिखा जा चुका है। लेकिन मुझे लगता है कि आप पहले से ही ऐसा करते हैं।

+0

नीचे मेरा कोड है। आपके पास जो कुछ भी है, उसके अलावा मैं रिवाइंड के बजाय fseek का उपयोग करता हूं। 'Fpos = ftell (fp); अगर ((fpos + bytesToWrite)> = maxFileSize) {fseek (fp, 0, SEEK_SET);} ' – Badri

+0

@ बर्दी फ्रेड डॉन' टी सिर्फ त्रुटि लौटाता है, यह एक संख्या देता है। क्या संख्या ? 'Feof() 'वापसी क्या करती है? साथ ही, 'feof() 'fseek, रिवाइंड और क्लीयरर (http://www.cplusplus.com/reference/clibrary/cstdio/clearerr/) पर रीसेट किया गया है। –

+0

लिखने की रैप पर, मैंने रैप स्थिति को एक साझा चर (म्यूटेक्स सुरक्षा के साथ) में सेट किया है। जब पठन स्थिति इस रैप स्थिति तक पहुंच जाती है तो मैं फ़्रेड करने से पहले भी फ़ाइल को संभालने के लिए रीडइंड करता हूं। तो मुझे उम्मीद नहीं होगी कि कोई त्रुटि नहीं होगी। जैसे ही पठन स्थिति अभी तक लपेटने की स्थिति तक नहीं पहुंच पाई है, भले ही मुझे लिखने के लिए गलत त्रुटियां मिलती हैं। पढ़ना हमेशा मेरे आकार में लिखने के आकार के रूप में एक ही आकार होगा – Badri

संबंधित मुद्दे