पर खुलता नहीं है मैं आउटपुट के लिए एक फ़ाइल खोलने और इसमें शामिल करने की कोशिश कर रहा हूं। इसमें शामिल होने के बाद, मैं फ़ाइल में कहीं और अपनी आउटपुट स्थिति को स्थानांतरित करना चाहता हूं और मौजूदा डेटा को ओवरराइट करना चाहता हूं। जैसा कि मैं इसे समझता हूं, std::ios_base::app
बल सभी फाइल के अंत में नहीं है जो मैं करना चाहता हूं। इस प्रकार, मेरा मानना है कि std::ios_base::ate
std::ofstream::open()
पर जाने के लिए सही ध्वज है। हालांकि, यह काम नहीं कर रहा हो जाने की उम्मीद के रूप में लगता है:std :: std :: ateream के साथ अंत में
// g++ test.cpp
// clang++ test.cpp
// with and without -std=c++11
#include <iostream>
#include <fstream>
int main() {
std::streampos fin, at;
{
std::ofstream initial;
initial.open("test", std::ios_base::out | std::ios_base::binary);
if (not initial.good()) {
std::cerr << "initial bad open" << std::endl;
return 1;
}
int b = 100;
initial.write((char*)&b, sizeof(b));
initial.flush();
if (not initial.good()) {
std::cerr << "initial write bad" << std::endl;
return 1;
}
fin = initial.tellp();
}
{
std::ofstream check;
check.open("test", std::ios_base::out | std::ios_base::binary | std::ios_base::ate);
if (not check.good()) {
std::cerr << "check bad open" << std::endl;
return 1;
}
at = check.tellp();
if (fin != at) {
std::cerr << "opened at wrong position!\nfin:\t" << fin << "\n" << "at:\t" << at << std::endl;
return 1;
}
int bb = 200;
check.write((char*)&bb, sizeof(bb));
check.flush();
if (not check.good()) {
std::cerr << "check write bad" << std::endl;
return 1;
}
at = check.tellp();
}
if ((fin + std::streampos(sizeof(int))) != at) {
std::cerr << "overwrite?\nfin:\t" << fin << "\n" << "at:\t" << at << std::endl;
return 1;
}
return 0;
}
विशेष रूप से, यह है कि std::ios_base::ate
नहीं कदम उदाहरण ऊपर देखा के साथ अंत करने के लिए प्रारंभिक उत्पादन सूचक करता है लगता है। जाहिर है, इसका परिणाम फ़ाइल की शुरुआत को ओवरराइट करने वाला पहला लिखना होगा (जो मेरी परेशानी का कारण बनता है)।
ऐसा लगता है या तो कार्यान्वयन सही नहीं है कि वरना cplusplus.com गलत है ("आउटपुट स्थिति फ़ाइल के अंत में शुरू होता है।") और cppreference.com अस्पष्ट है ("धारा के अंत करने के लिए तुरंत खुल जाएं तलाश ": कौन सी स्ट्रीम?)।
स्पष्ट रूप से एक आसान कामकाज है: बस stream.seekp(0, std::ios_base::end)
का उपयोग करें।
तो मेरा प्रश्न इस प्रकार है: क्या मेरा कोड गलत है? क्या कार्यान्वयन गलत है? क्या संदर्भ साइट गलत हैं? किसी भी जानकारी की सराहना की जाएगी।
http://en.cppreference.com/w/cpp/io/ छोटा किया जा सकता basic_filebuf/खुला। 'ऐप' या 'इन' ट्रंकेट्स के बिना 'आउट' का उपयोग करना। –