Cách thích hợp để đọc một tệp văn bản thành một chuỗi các dòng là gì? Tôi đã tìm thấy thông tin sau trên Rosetta Stone:đọc một tệp thành một dãy các dòng trong d
string[] readLines(string filename) {
auto f = File(filename);
scope(exit) f.close();
string[] lines;
foreach (str; f.byLine) {
lines ~= str.idup;
}
return lines;
}
nhưng có vẻ như nó đang thực hiện một thay đổi kích thước mảng trên mỗi dòng, điều này khá không hiệu quả. Tôi có thể theo dõi các số dòng đọc và thay đổi kích thước mảng thông qua phương thức tăng gấp đôi tiêu chuẩn
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;
nhưng đó là đủ mã boilerplate rằng tôi phải tự hỏi, nếu tôi không chỉ nhìn ra một cái gì đó trong thư viện chuẩn đã làm điều này cho tôi.
Edit: cho bình luận dễ thấy hơn fwend của: this article mô tả chi tiết cách thức hoạt động mảng cấp phát, và lý do tại sao phụ thêm được xử lý một cách hiệu quả bởi thời gian chạy
tôi đọc qua điều đó, và nó không nói bất cứ điều gì về chiến lược thay đổi kích thước nội bộ khi phụ thêm vào một mảng –
Vâng, tôi đã nhận thấy điều đó, nhưng tôi biết đó là cách nó hoạt động. Để biết thêm chi tiết, D thực sự phân bổ bộ nhớ theo khối lượng của hai kích thước, vì vậy nếu mảng phát triển lớn hơn, nói, 32 byte, nó sẽ phân bổ lại thành một đoạn 64 byte. – ricochet1k
okay, cảm ơn, đó là điều tốt để biết –