Если вы подумываете о чтении в больших кусках данных, вы будете использовать технику, называемую буферизацией. Однако ifstream уже обеспечивает буферизацию, поэтому мой первый шаг будет состоять в том, чтобы увидеть, можете ли вы получить ifstream, выполняющий эту работу за вас.
Я установил бы гораздо больший буфер, чем значение по умолчанию в вашем потоке. Кое-что как
const int BUFSIZE = 65536;
std::unique_ptr<char> buffer(new char[BUFSIZE]);
std::ifstream is;
is.rdbuf()->pubsetbuf(buffer.get(), BUFSIZE);
is.open(filename.c_str());
const int LINESIZE = 256;
char line[LINESIZE];
if (is) {
for (;;) {
is.getline(line, LINESIZE);
// check for errors and do other work here, (and end loop at some point!)
}
}
is.close();
Убедитесь, что ваш буфер живет так долго, как объект ifstream, который его использует.
Если вы обнаружите, что этого недостаточно, вы можете попробовать прочитать фрагменты данных ifstream :: read. Нет гарантии, что это будет быстрее, вам придется время и сравнить варианты. Вы используете ifstream :: читаете что-то вроде этого.
const int BUFSIZE = 65536;
std::unique_ptr<char> buffer(new char[BUFSIZE]);
is.read(buffer.get(), BUFSIZE);
Вы должны будете заботиться писать код для вызова ifstream.read заботясь, чтобы иметь дело с тем, что «линия» ввода может получить расколоть через последовательные блоки (или даже в более чем двух блоков в зависимости от ваших данных и размера буфера). Вот почему вы хотите изменить буфер буфера в качестве первого варианта.
Вам нужно будет просмотреть _все_ данные из файла, прежде чем вы начнете его обрабатывать, или вы можете обрабатывать данные независимо для каждой строки? То, что у вас есть, уже довольно эффективно. (не волнуйтесь или попробуйте оптимизировать базовую буферизацию). –
Посмотрите на istream :: читайте, чтобы читать в кусках или блоках, тогда вам понадобится дополнительная обработка для работы с куском, но вы можете сделать меньше чтений. – diverscuba23
@ πάνταῥεῖ Я хочу читать в кусках не целую строку 'string', потому что файл очень большой – Kamsa