Итак, я работаю над чтением большого текстового файла (100 КБ + символов) и сохранением его в большом массиве символов.
Я провел мозговой штурм, чтобы найти наилучший алгоритм для этого. Теперь я знаю, что чтение файла является дорогой операцией с точки зрения временной сложности.
До сих пор я придумал это, используя C ++:
//Opening the text file from the path given
char * dataset;
int dataLength;
ifstream in(path);
if (!in) {
cout << "Could not open the file." << endl;
exit(-1);
}
//Calculating the number of characters in the file
in.ignore(numeric_limits<streamsize>::max());
dataLength = in.gcount();
//Clearing since EOF bit is set after ignore method above
in.clear();
in.seekg(0, ifstream::beg);
//Initializing the dataset array and copying the data
dataset = new T[dataLength + 1];
in.read(dataset, dataLength);
dataset[dataLength] = '\0';
Я не читаю символ за символом, поскольку это делает очень дорогостоящую операцию. Теперь, пытаясь улучшить его, я подумал, что будет способ не читать файл дважды.
В моем алгоритме я должен сначала прочитать его (используя .ignore), чтобы подсчитать количество символов, чтобы я мог создать динамический массив символов. И тогда я должен прочитать его, чтобы сохранить его в массив символов.
Есть ли способ, что когда я читаю файл в первый раз, я могу временно сохранить данные в потоке, инициализировать массив и затем попросить поток скопировать данные в мою структуру данных (массив)
Задача ещё не решена.
Других решений пока нет …