|
|
|
|
|
|
|
Вернуться
| 1 Егоров Илья Валерьевич, 09 июня 2019 г. 3:09:47 | |
В таком случае вот как приблизительно будет выглядеть чтение строки (стоит заметить, ответ Беляева подразумевает чтение всего файла, а не только одной строки в традиционном понимании): unsigned char c; // для определенности while(c = getChar() && c != '\n') { // char getChar(void) — наша функция чтения символа из буфера, если она в таком виде делаем_что_то_с_символом(c); } Можно также проверять на '\r', прочие управляющие символы (см. ascii), peekChar для удобства определить, но в целом решение такого рода. Более красивое решение можно откопать у меня на pastebin (ie9), но там для его расширения полезно знать type_traits.
|
|
|
| 2 Егоров Илья Валерьевич, 09 июня 2019 г. 2:40:52 | |
Вот пример таких условий: 0. Мы знаем что делаем. 1. Выбран оптимальный размер буфер. Обычно это магическое "4096", объяснение которому можно найти на StackOverflow и прочих ресурсах. Увы, но встроенный макрос BUFSIZ не всегда оптимален, особенно когда дело касается файлов заведомо неизвестного размера. 2. Если нас интересует не сам поток символов, а лишь токены, то, зная максимальную длину токена, мы можем проверять достижение конца буфера лишь после считывания токена, а не после каждого считанного символа. Актуально как для stdio, так и для iostream (при условии отрубки синхронизации в последнем): с таким подходом оба практически эквивалентны, разве что инструкций при втором больше будет.
|
|
|
| 3 Егоров Илья Валерьевич, 09 июня 2019 г. 2:27:47 | |
Не соглашусь. Следует сначала определиться, что понимается под посимвольным чтением. Если посимвольное чтение — это обращение к файловой системе "считай 1 символ, перейди к следующему", то да, оно медленнее, ибо такие вот обращения дорого стоят. Но если посимвольное чтение — это "ФС, считай кусок N байт мне в буфер (одним вызовом), а я из буфера буду циклом брать по символу и при достижении конца буфера снова считывать в буфер", то это более чем эффективно. И при определенных условиях мы выигрываем как по памяти, так и по времени.
|
|
|
| 4 Меньшиков Фёдор Владимирович, 19 февраля 2019 г. 22:20:04 | |
|
Мне кажется следует уточнить, правда ли "читать всю строку неэффективно". Обычно посимвольное чление как раз медленнее. А памяти на acmp дают обычно от 16 Мбайт, так что 8-16 млн символов с помощью getline вполне можно прочитать. А бОльшие тесты крайне редко встречаются.
|
|
|
| 5 Беляев Сергей Николаевич, 19 февраля 2019 г. 14:06:09 | |
Если в этой строке нет разделителей (пробелов и табуляций), то проще всего так: char c; while(cin >> c) cout << c;
|
|
|
Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!
| | | |