2013-06-01 14 views
6

मैं एक प्रोग्राम बना रहा हूं जो शुरू होने पर, एक पूर्वनिर्धारित स्ट्रिंग को फ़ाइल में लिख देगा। फ़ाइल आकार में लगभग 5 एमबी है इसलिए हेक्स में 5 एमबी डेटा के साथ स्ट्रिंग भरना एक बड़ा चर है। जब मैं इसे संकलित करने का प्रयास करता हूं, तो मुझे एक त्रुटि मिलती है कि स्ट्रिंग बहुत बड़ी है। क्या 5 एमबी वास्तव में बड़ा है? मैंने स्ट्रिंग को 4 खंडों में विभाजित किया लेकिन प्रत्येक खंड अभी भी बहुत बड़ा है। :/इस स्थिति को ठीक करने के लिए मैं जल्दी और आसानी से क्या कर सकता हूं।सी ++ स्ट्रिंग बहुत बड़ा, पिछला वर्ण छेड़छाड़

नोट: मैं अपने आप को अभी शुरुआत प्रोग्रामर पर विचार करें ताकि मेरे सिर पर बहुत दूर जाना नहीं की कोशिश: पी

कैसे मैं एक फाइल करने के लिए स्ट्रिंग लिखने का उदाहरण:

string file_hex("huge_a**_string_goes_here_or_in_separate_cpp"); 

ofstream file_out; 
file_out.open("tools\\c.exe", ios::binary | ios::trunc); 
string res; 
res.reserve(file_hex.size()/2); 
for (int i = 0; i < file_hex.size(); i += 2) 
{ 
    std::istringstream iss(file_hex.substr(i, 2)); 
    int temp; 
    iss >> std::hex >> temp; 
    res += static_cast<char>(temp); 
} 

file_out << res; 
file_out.close(); 
+0

आप कुछ उदाहरण कोड (स्पष्ट रूप से नहीं पूरी स्ट्रिंग) दे सकते हैं? – chris

+0

240cfa010000c7442408acb2820089742404c7042406000000e86c5ef8ff89d883c4105b5e5fc38d7600c744240ce7010000c7442408acb2820089742404c7042406000000e8405ef8ffc744240ce8010000c7442408acb2820089742404c7042409000000e8205ef8ff8b1f85db7422c744240cf8010000c7442408acb2820089742404c704240a ... स्ट्रिंग के – mrg95

+0

हिस्सा नहीं है, तो आप कोड स्ट्रिंग का उपयोग करता है का हिस्सा प्रदान कर सकता है? –

उत्तर

8

स्टैंडर्ड नहीं है अधिकतम स्ट्रिंग अक्षर की सीमा निर्दिष्ट करें, लेकिन न्यूनतम आकार का सुझाव देता है। अनुलग्नक बी से - कार्यान्वयन मात्रा

सीमा मात्रा है कि नीचे या दूसरों वर्णित शामिल विवश कर सकते हैं। प्रत्येक मात्रा के बाद ब्रैकेट किए गए नंबर को उस मात्रा के लिए न्यूनतम के रूप में अनुशंसित किया जाता है। हालांकि, ये मात्रा केवल दिशानिर्देश हैं और अनुपालन निर्धारित नहीं करते हैं।

  • एक स्ट्रिंग शाब्दिक (concatenation के बाद) में वर्ण [65 536]।

हालांकि मानक में एक ही अनुभाग भी कहा गया है निम्नलिखित

क्योंकि कंप्यूटर परिमित कर रहे हैं, सी ++ कार्यान्वयन अनिवार्य रूप से कार्यक्रमों की वे सफलतापूर्वक प्रक्रिया कर सकते हैं आकार में सीमित हैं। प्रत्येक कार्यान्वयन उन सीमाओं को दस्तावेज करेगा जहां जाना जाता है। यह दस्तावेज निश्चित सीमाओं का उल्लेख कर सकता है जहां वे मौजूद हैं, कहें कि उपलब्ध संसाधनों के एक समारोह के रूप में परिवर्तनीय सीमाओं की गणना कैसे करें, या कहें कि निश्चित सीमाएं मौजूद नहीं हैं या अज्ञात हैं।

यह मानना ​​सुरक्षित है कि 5 एमबी स्ट्रिंग अक्षर संकलक द्वारा लगाई गई अधिकतम सीमा से अधिक होने जा रहा है। स्ट्रिंग अक्षर के लिए किन सीमाओं को लगाया गया है यह निर्धारित करने के लिए आपको अपनी टूल श्रृंखला के दस्तावेज़ों का संदर्भ लेना चाहिए।

यदि आप विजुअल सी ++ कंपाइलर का उपयोग कर रहे हैं तो स्ट्रिंग अक्षर का अधिकतम आकार 16,384 बाइट है। MSDN documentation

स्ट्रिंग अक्षर की अधिकतम लंबाई 16,384 (16 के) बाइट्स है। यह सीमा प्रकार char [] और wchar_t [] के तारों पर लागू होती है। यदि एक स्ट्रिंग अक्षर में दोहरे उद्धरण चिह्नों में संलग्न भागों होते हैं, तो प्रीप्रोसेसर भागों को एक स्ट्रिंग में जोड़ता है, और प्रत्येक पंक्ति को संयोजित करने के लिए, यह बाइट्स की कुल संख्या में एक अतिरिक्त बाइट जोड़ता है।

+0

दिलचस्प। जानकारी के लिए धन्यवाद! :) क्या आप किसी .exe फ़ाइल को लिखने के लिए या शायद एक अलग तरीका के बारे में सोच सकते हैं? मुझे नहीं पता कि संसाधनों का उपयोग कैसे करें:/ – mrg95

+0

संसाधन फ़ाइल में स्ट्रिंग जोड़ना निश्चित रूप से एक विकल्प है और मेरी पहली सिफारिश होगी। ** ** ** इसे स्ट्रिंग तालिका में जोड़ें, इसके बजाय इसे कस्टम बाइनरी संसाधन के रूप में जोड़ें। [एमएसडीएन] (http://msdn.microsoft.com/en-us/library/zabda143 (v = vs.71) .aspx) संसाधनों के साथ काम करने के लिए एक अच्छा प्रारंभिक बिंदु है। –

+0

@ user2356609 एक [यहां पर उत्तर] [http://stackoverflow.com/a/2740236/845568) है जो आपके आवेदन में बाइनरी संसाधन जोड़ने के लिए मूल चरणों का वर्णन करता है। –

2

यदि आप केवल त्वरित और गंदे होने की कोशिश कर रहे हैं, तो इसे करने के लिए सी के स्तर 3 आईओ का उपयोग करें और मूल्यों को संग्रहीत करने के लिए एक स्थिर सरणी का उपयोग करें।

#include <stdio.h> 

static const unsigned char data[] = { 
    1, 5, 255, 128, 50, 192, 
    // all the values of your file here, 
    // don't add a trailing zero, this is not a string. 
}; 

int main(int argc, const char* argv[]) 
{ 
    FILE* fp = fopen("test.txt", "wb"); 
    if (fp == NULL) { 
     printf("No dice.\n"); 
     return -1; 
    } 
    // write the entire array to the file without. 
    fwrite(data, sizeof(data[0]), sizeof(data), fp); 
    fclose(fp); 
    return 0; 
} 
0
बजाय इस बात का

:

char* metaDescriptor = "very long string"; 

यह होना चाहिए:

char* metaDescriptor = "very long" 
         "string"; 
संबंधित मुद्दे