Мне нужно написать файл на C ++. Контент является токеном из цикла while, так что теперь я пишу его построчно.
Теперь я думаю, что могу улучшить время записи, сохранив все содержимое в переменной, а затем записать файл.
Кто-нибудь знает, какой из двух способов лучше?
Каждая строка написана этой функцией:
void writeFile(char* filename, string value){
ofstream outFile(filename, ios::app);
outFile << value;
outFile.close();
}
while(/* Something */){
/* something */
writeFile(..);
}
Другой способ:
void writeNewFile(char* filename, string value){
ofstream outFile(filename);
outFile<<value;
outFile.close();
}
string res = "";
while(/* Something */){
/* something */
res += mydata;
}
writeNewFile(filename, res);
Рассматривали ли вы;
ofstream outFile(filename);
while(/* Something */){
/*...*/
outFile<< mydata;
}
outFile.close();
Выходной файл (потоки) буферизуется, что означает, что он будет накапливать данные во внутреннем буфере (например, в строке) перед записью на диск — вы вряд ли сможете превзойти его, если у вас нет особых требований
В первом случае вы закрываете файловый поток на каждой итерации цикла и открываете новый поток, было бы лучше сделать что-то вроде:
void writeFile(const std::string& value, std::ostream* os = nullptr) {
if (os != nullptr) {
os << value;
}
}
Или же:
void writeFile(const std::string& value, std::ostream& os) {
os << value;
}
А потом позвоните с fstream
объект (или его адрес в первом случае) вы создали в другой функции / main / что угодно.
Что касается того, быстрее ли писать непрерывно или в конце, это действительно зависит от того, какие вычисления вы выполняете в while
цикл и насколько это замедлит весь процесс. Однако из соображений надежности иногда лучше писать непрерывно, чтобы не потерять все данные, если во время сбоя программы произойдет сбой. while
выполнение цикла по любой причине.
Объекты fstream уже буферизованы, поэтому добавление в строку не очень вам помогает, фактически можно даже потерять производительность в результате перераспределения содержимого строки при превышении ранее выделенного размера. Надо бы проверить, чтобы знать.