2011-06-21 11 views
11

मैं सामग्री को मिटाने के बिना लिखने के लिए एक बाइनरी फ़ाइल खोलने की कोशिश कर रहा हूं। लेकिन मैं ईओएफ को लिखना नहीं चाहता हूं। मैं फ़ाइल में एक विशिष्ट स्थिति में लिखना चाहता हूँ।मौजूदा बाइनरी फ़ाइल के बीच में लिखें C++

यहाँ एक litte उदाहरण है:

ofstream out("test.txt", ios::binary | ios::app); 
for(int i = 0; i < 100; i++) 
    out.put('_'); 
out.write("Hallo", 5); 
out.close(); 

ofstream out2("test.txt", ios::binary | ios::app); 
out2.seekp(10); 
out2.write("Welt", 4); 
out2.close(); 

एप्लिकेशन का उपयोग करने के लिए, की तलाश काम नहीं करता। यदि ऐप खोलने वाली फ़ाइल का उपयोग नहीं करना डेटा मिटा देता है। क्या किसी को जवाब पता है?

उत्तर

10

seekp के दूसरे अधिभार, और एक दिशा, यह आपके मामले में फ़ाइल की शुरुआत की जा सकती है (अर्थात ios_base::beg) जो आप प्रदान करने के लिए एक ऑफसेट की अनुमति देता है की कोशिश करो। यह निश्चित रूप से आपको लगता है कि आप क्या कर रहे हैं और आप जो कुछ करना चाहते हैं वह मौजूदा वर्णों को ओवरराइट कर रहा है।

संपादित करें: यहाँ पूरी तरह से काम कर रहा है उदाहरण:

#include <iostream> 
#include <fstream> 

using namespace std; 
int main() 
{ 
    { 
    ofstream out("test.txt", ios::binary); 
    for(int i = 0; i < 100; i++) 
     out.put('_'); 
    out.write("Hallo", 5); 
    } 

    { 
    fstream out2("test.txt", ios::binary | ios::out | ios::in); 
    out2.seekp(10, ios::beg); 
    out2.write("Welt", 4); 
    } 
} 
+0

मैंने अभी कोशिश की है 2.seekp (10, ios_base :: beg); वह कुछ भी नहीं बदलता है। –

+0

जब तक आप ios :: trunc – crashmstr

+0

@crashmstr निर्दिष्ट नहीं करते हैं, तब तक फ़ाइल को मिटाना नहीं चाहिए, आप सही हैं। मैं अपनी टिप्पणी हटा रहा हूँ। –

5

आप जादुई रूप से बीच में फ़ाइल का विस्तार नहीं कर सकते हैं। शायद एक नई फ़ाइल को लिखना सबसे आसान है: सबसे पहले प्रारंभिक सेगमेंट कॉपी करें, फिर अपना नया डेटा लिखें, फिर शेष सेगमेंट कॉपी करें। जब सब कुछ किया जाता है, तो आप मूल फ़ाइल को ओवरराइट कर सकते हैं।

+0

मैं फ़ाइल को बीच में विस्तारित नहीं करना चाहता हूं। मैं इनहित मूल्यों को ओवरराइट करना चाहता हूं! –

+0

@ जॉनी: यह नहीं है कि आपने अपने प्रश्न में क्या कहा था। आपने कहा "सामग्री मिटाए बिना"। अन्यथा यह मामूली है, केवल लिखने के लिए खुला है (बिना "संलग्न"), शुरुआत और लिखने की तलाश करें। –

+0

मैं शुरुआत में लिखना नहीं चाहता हूं। मैं फाइल में कहीं लिखना चाहता हूं। समस्या फिर से फाइल खोलने से सामग्री मिटा दी जाएगी। उदाहरण के लिए: शुरुआत में फ़ाइल: ______________________ मैनिपुलेशन के बाद फ़ाइल: ______Bla_______ –

5

जब ios :: एप्लिकेशन के साथ खोलने, यदि आप है कि बस किसी मौजूदा फ़ाइल के साथ संलग्न किया हुआ एक नया फ़ाइल को खोलने के रूप में है: आप मौजूदा फाइल तक नहीं पहुंच सकता है। मुझे यकीन नहीं है, क्योंकि मैं केरेक के जवाब में ऐसा करता हूं, लेकिन यदि आप वास्तव में कोशिश करना चाहते हैं, तो आपको शायद "आईओएस :: इन | आईओएस :: आउट" के साथ खोलना होगा, फॉपेन ("परीक्षण। txt "," rw ")।

या क्रैशमस्ट्रेट बताते हैं: आईओएस :: आउट पर्याप्त हो सकता है।

+4

आपको 'ios :: out' और 'ios :: in' दोनों की आवश्यकता है, अन्यथा, यह बस मेथिंक को ओवरराइट करता है .. – Nim

+0

हां क्योंकि' ios :: out' अकेले लिनक्स पर निम्न प्रकार की खुली कॉल में परिणाम देता है : O_WRONLY | O_CREAT | O_TRUNC, 'ios :: आउट | आईओएस :: इन परिणामों में ओ_आरडीडब्लूआर कॉल में, O_TRUNC के बिना। – daminetreg

2

fstream के विनिर्देश यहाँ

fstream::open

ios :: एप्लिकेशन के अनुसार, "प्रत्येक उत्पादन ऑपरेशन से पहले धारा के अंत तक धारा की स्थिति सूचक सेट करता है।" तो ios :: ऐप प्रतिस्थापन के लिए काम नहीं करता है, कम से कम मेरे लिए किसी भी प्रकार की विफलता की तलाश करता है।

बस आईओएस :: आउट का उपयोग करके फ़ाइल सामग्री को केवल आकार को संरक्षित करता है, मूल रूप से फ़ाइल को ट्रैश में बदल देता है।

आईओएस :: इन | आईओएस :: बाहर मेरे लिए एकमात्र काम करने वाली चीज़ के रूप में बाहर निकला।

0

कार्य कोड: यह कोड cout.exe में एक स्ट्रिंग (OLD-STRING) की खोज करता है और एक नई स्ट्रिंग (NEW-STRING) के साथ प्रतिस्थापित करता है।

`#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    fstream ifs; 
    ifs.open ("C:\\Users\\user\\Desktop\\cout.exe", fstream::binary | fstream::in | fstream::out); 

    std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()); 

    size_t pos = str.find("OLD-STRING"); 

    if (pos != string::npos) 
    { 
    cout << "string found at position: " << int(pos) << endl; 

    ifs.seekp(pos); 

    ifs.write("NEW-STRING", 10); 

    } 
    else 
    { 
    cout << "could not find string" << endl; 
    } 

    if (ifs.is_open()) 
    ifs.close(); 

    return 0; 
}` 
संबंधित मुद्दे