2013-06-01 12 views
6

Sto creando un programma che, una volta avviato, scriverà una stringa predefinita in un file. Il file ha una dimensione di circa 5 mb, quindi riempire la stringa con 5 mb di dati in esadecimale è una grande variabile. Quando provo a compilarlo, ricevo un errore nel dire che la stringa è troppo grande. 5 MB è davvero così grande? Ho diviso la stringa in 4 sezioni, ma ogni sezione è ancora troppo grande. :/cosa posso fare rapidamente e facilmente per risolvere questa situazione.C++ stringa troppo grande, caratteri finali troncati

Nota: Mi considero un programmatore principiante quindi cercate di non andare troppo lontano sopra la mia testa: P

Esempio di come scrivo la stringa in un file:

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

Potrebbe dare qualche esempio di codice (ovviamente non l'intera stringa)? – chris

+0

240cfa010000c7442408acb2820089742404c7042406000000e86c5ef8ff89d883c4105b5e5fc38d7600c744240ce7010000c7442408acb2820089742404c7042406000000e8405ef8ffc744240ce8010000c7442408acb2820089742404c7042409000000e8205ef8ff8b1f85db7422c744240cf8010000c7442408acb2820089742404c704240a ... – mrg95

+0

Non fa parte della stringa, potrebbe fornire la parte di codice che utilizza la stringa? –

risposta

8

La norma non Specificare un limite massimo di di stringhe letterali, ma suggerisce una dimensione minima minima. Da Allegato B - quantità di attuazione

I limiti possono limitare le quantità che includono quelli descritti di seguito o di altri. Il numero tra parentesi dopo ogni quantità è raccomandato come minimo per quella quantità. Tuttavia, queste quantità sono solo linee guida e non determinano la conformità.

  • Caratteri in una stringa letterale (dopo la concatenazione) [65 536].

Tuttavia la stessa sezione nella norma afferma anche il seguente

Poiché i computer sono finite, C++ implementazioni sono inevitabilmente limitate nella dimensione dei programmi che possono con successo processo. Ogni implementazione deve documentare tali limiti laddove noti. Questa documentazione può citare limiti fissi laddove esistono, come calcolare i limiti variabili in funzione delle risorse disponibili, o dire che i limiti fissi non esistono o sono sconosciuti.

Si può presumere che un valore letterale di stringa di 5 MB superi i limiti massimi imposti dal compilatore. È necessario fare riferimento alla documentazione della catena di strumenti per determinare quali limiti sono imposti per i valori letterali stringa.

Se si utilizza il compilatore di Visual C++, la dimensione massima di una stringa letterale è 16.384 byte. Da MSDN documentation

La lunghezza massima di una stringa letterale è 16.384 (16K) byte. Questo limite si applica alle stringhe di tipo char [] e wchar_t []. Se una stringa letterale consiste di parti racchiuse tra virgolette doppie, il preprocessore concatena le parti in una singola stringa e per ogni riga concatenata aggiunge un byte aggiuntivo al numero totale di byte.

+0

Interessante. Grazie per le informazioni! :) Riesci a pensare ad un modo per aggirare questo o forse un modo diverso di scrivere un file .exe? Non ho idea di come utilizzare le risorse:/ – mrg95

+0

Aggiungere la stringa al file di risorse è sicuramente un'opzione e sarebbe la mia prima raccomandazione. Do ** not ** aggiungilo alla tabella di stringhe, invece, aggiungilo come risorsa binaria personalizzata. [MSDN] (http://msdn.microsoft.com/en-us/library/zabda143 (v = vs.71) .aspx) ha un buon punto di partenza per lavorare con le risorse. –

+0

@ user2356609 C'è anche una [risposta qui su SO] (http://stackoverflow.com/a/2740236/845568) che descrive i passaggi di base per aggiungere la risorsa binaria alla tua applicazione. –

2

Se si sta cercando di essere solo veloci e sporchi, utilizzare l'IO di livello 3 di C per farlo e utilizzare una matrice statica per memorizzare i valori.

#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

invece di questo:

char* metaDescriptor = "very long string"; 

dovrebbe essere:

char* metaDescriptor = "very long" 
         "string";