मेरे पास .bin फ़ाइल में स्टोर करने के लिए बड़ी मात्रा में बाइनरी डेटा है। मैं डेटा प्रकार को स्ट्रिंग करने के लिए बाइनरी मान संग्रहीत करता हूं और इसे कई बार .bin फ़ाइल में लिखता हूं, क्योंकि डेटा इसे एक स्ट्रिंग चर में संग्रहीत करने के लिए बहुत लंबा है और फिर इसे फ़ाइल में लिखता है। समस्या यह है कि जब मैं फ़ाइल से इस डेटा को पढ़ने का प्रयास करता हूं तो मुझे इसे आंशिक रूप से पढ़ने और स्ट्रिंग चर में संग्रहीत करने की आवश्यकता होती है, उस स्ट्रिंग का उपयोग करने और खाली करने और प्रक्रिया को दोहराने की आवश्यकता होती है। मुझे ऐसा करने में कठिन समय है, क्योंकि मैं डेटा को सही ढंग से नहीं पढ़ता (यह इसे पहली बार सही ढंग से पढ़ता है, लेकिन जब यह फिर से स्ट्रिंग करने के लिए डेटा पढ़ता है तो यह कुछ गड़बड़ करता है - मुझे लगता है कि यह फ़ाइल की शुरुआत से फिर से पढ़ना शुरू कर देता है जहां से यह छूट गया)। अगर किसी के पास एक कदम में बड़ी मात्रा में बाइनरी डेटा को पढ़ने और स्टोर करने के बारे में कोई विचार है या मेरे कार्यान्वयन को बेहतर तरीके से करना है तो यह बहुत मददगार होगा। पहले ही, आपका बहुत धन्यवाद :)

यह मेरा अब तक का कोड है:

static string ReadBinary()
{
    string temp = "";

    FileStream fs = new FileStream(@"C:/Compression/compressed.bin", FileMode.Open,FileAccess.Read);
    if (fs.CanRead)
    {
        byte[] buffer = new byte[fs.Length/8];
        int bytesread = fs.Read(buffer, 0, buffer.Length);
        temp = Encoding.ASCII.GetString(buffer, 0, bytesread);
    }
    
    /*BinaryReader br = new BinaryReader(fs);
    string temp = System.Text.Encoding.UTF8.GetString(br.ReadBytes(1000));
    br.Close();*/
    fs.Close();
    
    return temp;
}
0
Tomaž Klobučar 27 अक्टूबर 2020, 21:33

3 जवाब

सबसे बढ़िया उत्तर

यदि आप MBs में फ़ाइल के साथ काम कर रहे हैं

आप उपयोग कर सकते हैं

static string ReadBinary()
{
    return File.ReadAllText(@"C:/Compression/compressed.bin");
}

या यदि आप byte[] चाहते हैं जो बाइनरी जानकारी संग्रहीत करने के लिए सही डेटा टाइप है तो आप कर सकते हैं

static byte[] ReadBinary()
{
    return File.ReadAllBytes(@"C:/Compression/compressed.bin");
}
0
Mihir Dave 27 अक्टूबर 2020, 21:58

मुझे लगता है कि यह फ़ाइल की शुरुआत से फिर से पढ़ना शुरू कर देता है, जहां से इसे छोड़ा गया था

यह वास्तव में सही है, यह देखते हुए कि कोड कहता है

int bytesread = fs.Read(buffer, 0, buffer.Length);

और दूसरे पैरामीटर के लिए प्रलेखन है:

सरणी में बाइट ऑफ़सेट जिस पर रीड बाइट रखा जाएगा।

इसलिए, हर बार जब आप पिछले पठन पर छोड़े गए स्थान के बजाय शुरुआत से पढ़ना शुरू करते हैं।

इसे ठीक करने के बजाय, मैं आपको अपने कोड काफी को सरल बनाने का सुझाव दूंगा, क्योंकि 1.54MB एक छोटी फ़ाइल है। मैं आपको डेटा के लिए उपयुक्त डेटा संरचना का उपयोग करने का भी सुझाव दूंगा, एक string वर्णों को संग्रहीत करने के लिए है, बाइनरी डेटा नहीं, इसलिए byte[] यहां अधिक समझ में आता है।

कुल मिलाकर, आप अपने पूरे कोड को कम कर सकते हैं:

private static byte[] ReadBinary()
{
    return File.ReadAllBytes(@"C:/Compression/compressed.bin");
}
0
Camilo Terevinto 27 अक्टूबर 2020, 22:04

बाइनरी डेटा को पढ़ने और लिखने के लिए नीचे दी गई दिनचर्या 2 धाराओं का उपयोग करेगी। मुझे नहीं लगता कि स्थिति निर्धारित करने की आवश्यकता है, लेकिन यह सुनिश्चित करने के लिए कि यह स्ट्रीम की शुरुआत में है। आप CopyTo(source, buffersize) रूटीन में दूसरा पैरामीटर भी जोड़ सकते हैं। बफ़रसाइज़ में एक डिफ़ॉल्ट है लेकिन आप छोटे या बड़े मान सेट कर सकते हैं।

    private void Copy(string source, string dest)
    {
        using (var inputFileStream = File.OpenRead(source))
        using (var outputFileStream = File.Open(dest, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            inputFileStream.Position = 0; // Just to be sure it is at the start of the stream

            inputFileStream.CopyTo(outputFileStream);
        }
    }
-2
Paul Sinnema 27 अक्टूबर 2020, 22:01