Qual è il modo corretto di leggere un file di testo in una serie di linee? Ho trovato quanto segue su Rosetta Stone:legge un file in una serie di linee in d
string[] readLines(string filename) {
auto f = File(filename);
scope(exit) f.close();
string[] lines;
foreach (str; f.byLine) {
lines ~= str.idup;
}
return lines;
}
ma sembra che sta facendo un array ridimensionare per riga, che è piuttosto inefficiente. Potrei tenere traccia del numero di linee leggere e ridimensionare la matrice tramite il metodo raddoppio standard di
int i = 0;
foreach (str; f.byLine) {
if (lines.length <= i + 1) {
lines.length = lines.length * 2 + 1;
}
lines[i] = str.idup;
i++;
}
lines.length = i;
ma basta codice standard che mi chiedo se non sto solo si affaccia qualcosa nella libreria standard che lo fa già per me.
Edit: dare commentare maggiore visibilità del fwend: this article descrive in dettaglio come le opere di matrice allocatore, e perché l'accodamento è gestito in modo efficiente dal runtime
l'ho letto e non ha detto nulla sulla strategia di ridimensionamento interno durante l'aggiunta a un array –
Sì, lo stavo solo notando, ma so che è come funziona. Per ulteriori dettagli, D assegna effettivamente memoria in blocchi di potenza di due dimensioni, quindi se l'array diventa più grande di, diciamo, 32 byte, verrà riallocato in un blocco di 64 byte. – ricochet1k
ok, grazie, è bello sapere –