Quale metodo per archiviare un file di testo in memoria (c non c ++) mi permetterebbe di aprire qualsiasi formato (UTF-8, binario, ecc.) e un file di qualsiasi dimensione?

3

Il mio primo pensiero qui è di usare un array dinamico, ma sto cercando qualcosa di meglio.

Attualmente ho i file di testo aperti in "blocchi". Ogni parola o gruppo di spazi costituisce un "pezzo". Poi ho un numero di linea in questa struttura e un numero di blocco per l'ordine su una linea.

typedef struct TextData {
    char* chunk;
    int   index, line;
}TDATA;

Non sono sicuro che questa sia una buona idea in quanto potrebbe portare ad allocare molta memoria dinamica ed è soggetta a perdite di memoria. Almeno per quanto ne so.

Quello che sto cercando è un modo migliore per implementarlo.

Questo viene usato per un programma di combinazione di editor di testo / console che verrà trasformato in una lib dinamica per il riutilizzo in altri programmi / giochi. Una piccola impronta digitale è una parte importante di questa implementazione.

Il testo viene inserito in un buffer di caricamento di un buffer di annullamento tiene traccia solo dei pezzi modificati l'ultimo buffer è un buffer di visualizzazione che viene utilizzato da un'applicazione o un'interfaccia per visualizzare le modifiche non salvate del file completo.

Deve essere sicuro anche per i thread.

    
posta Joe 03.03.2016 - 11:09
fonte

1 risposta

4

Usa l'hardware - la maggior parte dei sistemi operativi ha un meccanismo per mappare un file di grandi dimensioni in una "finestra" di memoria e il sistema operativo (e MMU) gestisce la mappatura per te. Finché hai abbastanza spazio per gli indirizzi virtuali, puoi gestire un file di qualsiasi dimensione come se fosse stato caricato in memoria.

Dovrai cercare i file mappati in memoria.

Come per una funzione di annullamento, puoi tranquillamente memorizzare le modifiche in un elenco e applicarle al file in salvataggio se non vuoi salvarle immediatamente e fornire una funzione di annullamento per ripristinare i dati originali.

    
risposta data 03.03.2016 - 11:32
fonte

Leggi altre domande sui tag