Здравствуйте kirina, Вы писали:
K>Как в с++ считать строчку целиком из файла? K>kirina
ну если у тебя идет не только чтение а сериализация (чтение/ запись) то переде записью строки сохрани сначал в файле ее размер (количество символов) и при чтение будет просто считать строку целиком
Здравствуйте Коваленко Дмитрий, Вы писали:
КД>Здравствуйте kirina, Вы писали:
K>>Как в с++ считать строчку целиком из файла? K>>kirina
КД>getline для std::string из STL?
КД>
А насколько это эффективно по сравнению с
//------------------------------------------------------------
char ch;
DWORD readen;
smart_string str; // какой-нибудь класс, инкапсулирующий строку с изменяющимся размером
for (;)
{
if (!ReadFile(hFile, &ch, sizeof(ch), &readen, NULL)) break;
if (0 == readen) break;
if ('\r' == ch)
{
// считать '\n'
ReadFile(hFile, &ch, sizeof(ch), &readen, NULL);
break;
}
str.AddChar(ch);
}
//------------------------------------------------------------
или с
//------------------------------------------------------------
char buffer[MAX_EXPECTED_STRING_LENGTH];
fgets(buffer, sizeof(buffer)/sizeof(buffer[0]), pFile);
//------------------------------------------------------------
??? Тоесть не сопровождаются ли обращения к потокам большим количеством проверок, форматирования или еще чего то? Насколько велики издержки при получении удобств потоков вообще и файловых потоков в частности?
А то, хочется перейти на "прогрессивный" STL, но что то боязно. Можно просто ответить ссылкой, я разберусь.
Здравствуйте Константин Быченков, Вы писали:
КБ>Здравствуйте Коваленко Дмитрий, Вы писали:
КД>>Здравствуйте kirina, Вы писали:
K>>>Как в с++ считать строчку целиком из файла? K>>>kirina
КД>>getline для std::string из STL?
КД>>
КБ>А насколько это эффективно по сравнению с
Честно сказать? — не знаю.
Если очень интересно "что там и как делается", то смотри исходные тексты шаблона getline. В BCB3/5 они находятся в <istream.cc>
А вот насчет — насколько это гибче? Попаришься с реализацией поддержки однобайтных и двухбайтных символов — сам поймешь.
К тому же, на С++ пишут не только под Win32
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте Константин Быченков, Вы писали:
КБ>А насколько это эффективно по сравнению с ...
КБ>??? Тоесть не сопровождаются ли обращения к потокам большим количеством проверок, форматирования или еще чего то? Насколько велики издержки при получении удобств потоков вообще и файловых потоков в частности?
Сопровождаются <b>колоссальными</b>
издержками (тестровано на одном компиляторе, на одном STL)
КБ>А то, хочется перейти на "прогрессивный" STL, но что то боязно. Можно просто ответить ссылкой, я разберусь.
Гут. Не везде "прогрессивность" — хорошо. Надо иметь смелость иногда пользоваться тем хорошим, что есть в отживших/устаревших технологиях.
Здравствуйте Kaa, Вы писали:
Kaa>Здравствуйте Константин Быченков, Вы писали:
КБ>>А насколько это эффективно по сравнению с ...
КБ>>??? Тоесть не сопровождаются ли обращения к потокам большим количеством проверок, форматирования или еще чего то? Насколько велики издержки при получении удобств потоков вообще и файловых потоков в частности? Kaa>Сопровождаются <b>колоссальными</b>
издержками (тестровано на одном компиляторе, на одном STL)
КБ>>А то, хочется перейти на "прогрессивный" STL, но что то боязно. Можно просто ответить ссылкой, я разберусь.
Kaa>Гут. Не везде "прогрессивность" — хорошо. Надо иметь смелость иногда пользоваться тем хорошим, что есть в отживших/устаревших технологиях.
И, тем не менее, иногда использование STL оказывается дешевле и (не побоюсь этого слова) эффективнее.
К примеру, в данном случае, я думаю, оно вполне оправдано (если, разумеется, не запрещено требованиями проекта). Дисковые операции и так достаточно медленные и, как правило, являются разовыми.
Но, разумеется, в каждом конкретном случае надо отдельно принимать решение, использовать ли STL.
С уважением. Алик.
Re[4]: Чего это стоит? :)
От:
Аноним
Дата:
04.06.02 13:22
Оценка:
Здравствуйте Kaa, Вы писали:
Kaa>Здравствуйте Константин Быченков, Вы писали:
КБ>>А насколько это эффективно по сравнению с ...
КБ>>??? Тоесть не сопровождаются ли обращения к потокам большим количеством проверок, форматирования или еще чего то? Насколько велики издержки при получении удобств потоков вообще и файловых потоков в частности? Kaa>Сопровождаются <b>колоссальными</b>
Здравствуйте Kaa, Kaa>Гут. Не везде "прогрессивность" — хорошо. Надо иметь смелость иногда пользоваться тем хорошим, что есть в отживших/устаревших технологиях.
Сделал тест на BCB5. Возможно, не вполне корректный. Нехочу ничего хвалить или ругать, просто предлагаю к сведению.
Вот это работает 41 секунду
long ltmp;
ofs.open("stream.txt", std::ios_base::app);
if (!ofs)
{ MessageBox(NULL, "Не открывается выходной файл потока!!!", "Потоки и файлы", MB_OK);
return;
}
str = "===Это тест потока Строка 32 байт";
secstream = time(&secstream); //timefor (int i = 0; i < 32768*20; i++)
ofs << str << '\n';
ltmp = time(<mp);
secstream = ltmp - secstream;
ofs << secstream;
ofs.close();
ofs.clear();
А это 6 секунд. TMsgFile — мой класс, работающий через ReadFile/WriteFile
char buf0[20];
long ltmp;
MyFile = new TMsgFile("file.txt");
secfile = time(&secstream); //timefor (int i = 0; i < 32768*20; i++)
MyFile->WriteStrToFile("===Это тест файла Строка 32 байт\n");
ltmp = time(<mp); //itoa
secfile = ltmp - secfile;
itoa(secfile, buf0, 10);
MyFile->WriteStrToFile(buf0);
delete MyFile;