2013-06-01 121 views
6

我正在製作一個程序,當它啓動時,會將一個預定義的字符串寫入一個文件中。該文件的大小約爲5 MB,因此用十六進制填充5 MB數據的字符串是一個很大的變量。當我嘗試編譯它時,出現錯誤提示字符串太大。 5MB真的很大嗎?我將字符串分成4個部分,但每部分仍然太大。 :/我可以快速輕鬆地解決這種情況。C++字符串太大,拖尾字符被截斷

注:我認爲我是一個新手程序員,所以儘量不要走太遠在我的頭上:P我怎麼寫字符串到文件

例子:

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

標準不指定最大字符串文字的限制,但確實建議最小大小。從附件B - 實施批量

限可約束量包括以下的那些或其它描述。建議將每個數量後面的括號中的數字作爲該數量的最小值。但是,這些數量只是指導方針,並不能確定是否符合要求。

  • 字符串文字中的字符(連接後)[65 536]。

然而,在標準的相同部分也指出以下

因爲計算機是有限的,C++實現在它們可以成功地處理的程序的大小不可避免地受到限制。每個實施應記錄已知的限制。本文檔可能存在固定限制,說明如何根據可用資源計算可變限制,或者說固定限制不存在或不明確。

假設5MB的字符串文字將超過編譯器施加的最大限制是安全的。你應該參考工具鏈的文檔來確定對字符串文字施加了什麼限制。

如果使用的是Visual C++編譯器,則字符串文字的最大大小爲16,384 字節。來自MSDN documentation

字符串文字的最大長度是16,384(16K)個字節。此限制適用於char []和wchar_t []類型的字符串。如果字符串文字由用雙引號括起來的部分組成,則預處理器將這些部分連接成一個單獨的字符串,並且對於每一行連接起來,它會在總字節數中增加一個額外的字節。

+0

有趣。謝謝(你的)信息! :)你能想出任何解決這個問題的方法,或者寫一個.exe文件的方法嗎?我不知道如何使用資源:/ – mrg95

+0

將字符串添加到資源文件當然是一個選項,這將是我的第一個建議。不要**將其添加到字符串表中,而是將其添加爲自定義二進制資源。 [MSDN](http://msdn.microsoft.com/en-us/library/zabda143(v = vs.71).aspx)對於使用資源有一個很好的起點。 –

+0

@ user2356609還有一個[這裏的答案](http://stackoverflow.com/a/2740236/845568),它描述了將二進制資源添加到應用程序的基本步驟。 –

2

如果你只是想快速和骯髒,使用C的3級IO來做到這一點,並使用靜態數組來存儲值。

#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";