Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 
Вернуться
Тема: Перехожу на C++ с паскаля. Объясните пожалуйста, как считывать поток символов до конца строки. Например, дана одна строка в файле input.txt. Строка очень длинная, читать всю втроку неэффктивно. Надо считывать символы по одному, пока не закончится строка
1
  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;
1

Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!

Красноярский краевой Дворец пионеров, (c)2006 - 2026, ИНН 246305493507, E-mail: admin@acmp.ru