मैं एक बड़ी फाइल लिखने की कोशिश कर रहा हूं, लेकिन एक समस्या में भाग गया।सी ++ के साथ 4 जीबी फ़ाइल में डेटा कैसे लिखें?
मैं लिखने के लिए जगह खोजने के लिए लंबे समय तक उपयोग करता हूं, लेकिन 4,2 जीबी से अधिक फ़ाइल नहीं लिख सकता। मैं क्या भूल गया?
अधिक विवरण: मैं 4Gb-फ़ाइल को खोलने:
ifstream ifs(db_name.c_str(), ios_base::binary);
if (!ifs)
throw Bad_archive();
ifs.read(as_bytes(seg_size), sizeof(int));
ifs.read(as_bytes(last_idx), sizeof(int));
ifs.read(as_bytes(free_segs), sizeof(int));
if (free_segs > 0)
{
long long seek_g = 3 * sizeof(int) + (long long)last_idx * seg_size;
ifs.seekg(seek_g, ios_base::beg);
for (int i = 0; i < free_segs; i++)
{
int tmp = 0;
ifs.read(as_bytes(tmp), sizeof(int));
free_spaces.push_back(tmp);
}
}
ifs.close();
उसके बाद, मैं 400MB-फ़ाइल है, जो मैं db में जोड़ना चाहते हैं पढ़ें। और लिखने (यहाँ शॉर्ट कोड है):
// write object
ofstream ofs(db_name.c_str(), ios_base::binary | ios_base::in | ios_base::ate);
for (int i = 0; ; i++)
{
// set stream position
long long write_position = sizeof(int) * 3;
...
write_position += (long long) seg_size * last_idx;
ofs.seekp(write_position, ios::beg);
...
// write sizeof object
if (i == 0)
ofs.write(as_bytes(object_size), sizeof(object_size));
else
{
int null = 0;
ofs.write(as_bytes(null), sizeof(null));
}
// write data
for (int j = 0; j < (seg_size - sizeof(int) * 2); j++)
{
ofs.write(as_bytes(obj_content[j + i * (seg_size - sizeof(int) * 2)]),
sizeof(char));
}
if (write_new_seg)
last_idx++;
...
ofs.write(as_bytes(cont_seg), sizeof(cont_seg));
}
ofs.close();
उसके बाद, मैं db जानकारी को बचाने:
if (last_idx == 0)
{
ofstream ofs(db_name.c_str());
ofs.close();
}
ofstream ofs(db_name.c_str(), ios_base::binary | ios_base::in |
ios_base::out | ios_base::ate);
long long seek_p = 0;
ofs.seekp(seek_p, ios_base::beg);
ofs.write(as_bytes(seg_size), sizeof(seg_size));
ofs.write(as_bytes(last_idx), sizeof(last_idx));
ofs.write(as_bytes(free_segs), sizeof(free_segs));
ofs.close();
लेकिन इस कोड काम करता है:
ofstream ofs2("huge2");
ofs2.close();
ofstream ofs("huge2", ios_base::in | ios_base::ate);
long long sp = 10000000000;
ofs.seekp(10000000000, ios_base::beg);
ofs.write(as_bytes(sp), sizeof(sp));
ofs.close();
आप हमेशा एक लूप में खोज सकते हैं और जिस बिंदु पर आप चाहते हैं उसे अग्रिम कर सकते हैं लेकिन गैर गठबंधन ऑफसेट के लिए ट्रैक रखना मुश्किल हो जाता है। –
मैं कोशिश करूंगा। Thanx – bluebyte
कई सी ++ स्ट्रीम कार्यान्वयन पिछले शताब्दी में फंस गए हैं। जब 4 गीगाबाइट सभी के लिए पर्याप्त था। Char_traits :: pos_type को 64 अंगुलियों के साथ गिनने के लिए अद्यतन करना इतना आसान नहीं है, जो मौजूदा कोड को तोड़ देता है। Int के बारे में बात करते हुए उल्लिखित उत्तर स्पष्ट करता है। –