Domanda

Ho un file di testo molto grande, e il mio programma iPad esigenze a volte sostituire una singola riga di dati (nuova riga: '\ n'). Come posso fare questo in modo efficace? Scrivendo l'intero file in una volta non è un'opzione.

ho cercato in NSFileHandle, e sembra che farà ciò che voglio; in questo momento sto avendo problemi a capire come trovare la linea X, e poi sostituirlo con i dati provenienti da una stringa. Credo che dopo che è fatto, tutto quello che dobbiamo fare è chiamata synchronizeFile, giusto?

Apprezzo il vostro aiuto!

È stato utile?

Soluzione

Non puoi davvero fare questo senza scrivere l'intero file. Si potrebbe cercare l'inizio della linea e quindi scrivere la nuova linea. Ma prima che avrebbe dovuto scoprire l'offset di quella linea. Se non si dispone già che questo mezzo la lettura del file dall'inizio alla seconda linea. Poi si potrebbe scrivere la nuova linea, ma solo se è esattamente la stessa lunghezza della linea originale. Se è più tempo sarà sovrascrivere la riga successiva - non v'è alcun modo per inserire i dati in un file. Se la nuova linea è più corto di quello vecchio alla fine della vecchia linea rimarrà. Lo stesso requisito di lunghezza è anche difficile. Ciò significa che la stessa lunghezza in byte. A seconda della codifica dei caratteri dei personaggi potrebbe richiedere più byte rispetto ad altri.

Se davvero bisogno di fare questo e farlo funzionare per circa tutti i casi si avrebbe dovuto utilizzare questi passaggi:

  1. Leggi l'intero file per scoprire l'offset della linea che ti interessa
  2. Cercare di l'offset della linea
  3. Scrivi la nuova linea
  4. Scrivi il resto del file si legge al punto 1.

Questo algoritmo funziona, non importa quanto lungo o corto le linee sono o come sono codificati. Ma questo sarà probabilmente più costoso di un semplice iscritto l'intero file, soprattutto se si hanno in memoria in ogni modo.

Avete effettivamente verificato che non è accettabile per scrivere l'intero file o ci fai qui ottimizzazione prematura? Se il file di testo è davvero così grande si dovrebbe essere considerato una base di dati, come SQLite, o di utilizzare Core Data.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top