Назначение последовательностей триграфа в C ++?

Это проблема с текстовыми книгами журнальных файлов, и я хотел бы предложить другое решение.

Проблема с подходом «удаление строк в начале файлов» заключается в том, что добавление новых строк становится экстремально медленный, как только он должен удалить первые строки для каждой новой строки, которую он пишет.

Применять обычный файл журнала только включает в себя запись еще нескольких байтов в конце файла в файловой системе (и один раз в в то время как он должен выделять новый сектор, что приводит к обширной фрагментации - почему обычно используются файлы журналов.

Но большая проблема заключается в том, что вы удаляете строку в начале для каждой написанной строки. Весь файл сначала должен быть прочитан в память, а затем переписан, что приводит к огромному объему ввода-вывода на жестком диске (в сравнении). Хуже того, решения «разделить на PHP и пропустить первые строки» здесь крайне медленны из-за характера массивов PHP. Это не проблема, если лимит размера файла журнала очень мал или если он написан на неактивном, но с большим количеством записей (как в случае с файлами журналов), такую ​​же огромную операцию нужно выполнять много раз что приводит к серьезным недостаткам производительности.

Это можно представить как парковочные автомобили на линии с пространством на 50. Парковка первых 50 автомобилей - это быстро, просто заезжайте за автомобилем и сделайте это. Но когда вы дойдете до 50, и автомобиль впереди (начало файла) должен быть удален, вам нужно довести 2-й автомобиль до 1-й позиции, 3-й и 2-й и так далее, прежде чем вы сможете водить машину с последний автомобиль на 50-й позиции. (И это необходимо повторить для каждого нового автомобиля, который вы хотите припарковать!) [/ ​​G5]

Мое предложение вместо этого сохраняет в разные файлы журнала, по дате, а затем хранит максимум 30 дней назад и т. д. Таким образом, используя файловую систему, которая уже решила эту проблему отлично.

118
задан Kirill V. Lyadvinsky 2 September 2016 в 07:07
поделиться

9 ответов

Этот вопрос ( о тесно связанных орграфах) дает ответ.

Это сводится к тому факту, что набор символов ISO 646 не содержит всех символов синтаксиса C, поэтому есть некоторые системы с клавиатурами и дисплеями, которые не может иметь дело с персонажами (хотя я полагаю, что в настоящее время они довольно редки).

В общем, вам не нужно их использовать, но вам нужно знать о них именно для той проблемы, с которой вы столкнулись. Триграфы являются причиной того, что символ '? ' имеет escape-последовательность:

'\?'

Итак, есть несколько способов избежать проблемы с вашим примером:

 printf( "What?\?!\n" ); 

 printf( "What?" "?!\n" ); 

Но вы должны помнить, когда вы набираете два '?' символы, которые вы могли бы начать с триграфа (и я уж точно никогда не о чем думаю).

На практике триграфы и диграфы - это то, о чем я вообще не беспокоюсь изо дня в день. Но вы должны знать о них, потому что раз в пару лет вы будете сталкиваться с ошибкой, связанной с ними (и вы проведете остаток дня, проклиная их существование). Было бы неплохо, если бы компиляторы могли быть сконфигурированы так, чтобы предупреждать (или об ошибках), когда он встречает триграф или орграф, чтобы я мог знать, что у меня есть что-то, с чем я должен сознательно иметь дело.

И просто для полноты, орграфов много менее опасны, так как они обрабатываются как токены, поэтому орграф внутри строкового литерала не будет интерпретироваться как орграф.

Чтобы получить хорошее образование о различных развлечениях с пунктуацией в программах на C / C ++ (включая ошибку триграфа, из-за которой я определенно выдергивал бы волосы), взгляните на статью Херба Саттера GOTW № 86 .


Приложение:

Похоже, GCC не обрабатывает (и предупреждает) триграфы по умолчанию. У некоторых других компиляторов есть опции для отключения поддержки триграфа (например, IBM). Microsoft начала поддерживать предупреждение (C4837) в VS2008, которое должно быть явно включено (с помощью -Wall или чего-то еще).

90
ответ дан 24 November 2019 в 01:51
поделиться

Из Язык программирования C ++ Специальная версия, стр. 829

Специальные символы ASCII [, ] , {, } , | и \ занимают обозначенные позиции набора символов в алфавитном порядке по ISO. В большинстве европейских национальных наборов символов ISO-646 эти позиции занимают буквы, которых нет в английском алфавите.

Предоставляется набор триграфов, позволяющих переносить национальные символы с использованием действительно стандартного минимального набора символов. . Это может быть полезно для обмена программами, но не облегчает чтение программ людям. Естественно, долгосрочным решением этой проблемы для программистов на C ++ является получение оборудования, которое хорошо поддерживает как их родной язык, так и C ++. К сожалению, для некоторых это кажется невозможным, и внедрение нового оборудования может быть удручающе медленным процессом.

20
ответ дан 24 November 2019 в 01:51
поделиться

Дети сегодня! : -)

Да, иностранное оборудование, например терминал IBM 3270. В 3270, насколько я помню, фигурных скобок нет! Если вы хотели написать C на мини / мэйнфрейме IBM, вам приходилось использовать жалкие триграфы для каждой границы блока. К счастью, мне достаточно было написать программное обеспечение на C, чтобы эмулировать некоторые возможности миникомпьютера IBM, а не писать программное обеспечение C на System / 36.

Посмотрите рядом с буквой «P». ключ:

keyboard

Хммм. Трудно сказать. Рядом с «возвратом каретки» есть дополнительная кнопка, и я могу перевернуть ее: возможно, это была пара «[» / «]», которая отсутствовала. В любом случае, эта клавиатура доставит вам много хлопот, если вам придется писать C.

Кроме того, эти терминалы отображают EBCDIC, «родной» набор символов IBM для мэйнфреймов, не ASCII (спасибо, Павел Минаев, за напоминание).

С другой стороны, как сказано в руководстве по GNU C: «Вам не нужно это повреждение мозга». Компилятор gcc оставляет эту «функцию» отключенной по умолчанию.

20
ответ дан 24 November 2019 в 01:51
поделиться

Они предназначены для использования в системах, в которых отсутствуют некоторые символы в базовом наборе символов C ++. Излишне говорить, что такие системы чрезвычайно редки.

13
ответ дан 24 November 2019 в 01:51
поделиться

Триграфы были предложены для удаления в C ++ 0x. Тем не менее, кажется, что все еще есть веские аргументы в их поддержку - см. Статью комитета C ++ N2910 , в которой это обсуждается. Очевидно, EBCDIC - один из основных оплотов, где они нужны.

8
ответ дан 24 November 2019 в 01:51
поделиться

Я видел триграфы, которые использовались в начале 90-х для преобразования программ PL / 1 с мэйнфрейма для запуска / компиляции / отладки на ПК.

Они занимались редактированием PL / I на ПК, используя компилятор PL / I в C, и хотели, чтобы код работал при переносе обратно на мэйнфрейм, который не поддерживал фигурные скобки. Я посоветовал им использовать макросы вроде

#def BEGIN {    
#def END }  

или в качестве более удобной альтернативы PL / I

#def BEGIN ??<
#def END ??>

, и если они действительно хотят пофантазировать, они могут попробовать

#ifdef MAINFRAME
    #def BEGIN ??<
    #def END ??>
#else
    #def BEGIN {    
    #def END }  
#endif

, и тогда программа будет выглядеть так, как будто она написана на Паскале. Они просто смешно смотрели на меня и не разговаривали со мной до конца дня. Я не думаю, что виню их. :)

Что убило усилия, чем не триграфы, так это различия в системе ввода-вывода между платформами.

4
ответ дан 24 November 2019 в 01:51
поделиться

В первую очередь потому, что стандарт C представил их еще в 1989 году, когда возникли проблемы с наличием символов, которым сопоставляются триграфы на некоторых машинах. К тому времени, когда в 1998 году был опубликован стандарт C ++, потребность в триграфах была невелика. Это бородавка на C; они такие же бородавки на C ++. В них была потребность - особенно за пределами англоязычного мира - поэтому они были добавлены в C.

2
ответ дан 24 November 2019 в 01:51
поделиться

Некоторые европейские клавиатуры не имеют (не имеют?) всех знаков пунктуации, которые есть на американских клавиатурах, потому что они нужны были ключи для их необычных буквенных знаков. Так, например (придумав это), на шведской клавиатуре будет A-образное кольцо на месте фигурной скобки.

Для удобства таких пользователей триграфы - это способ ввода знаков препинания с использованием только наиболее распространенных символов ASCII.

3
ответ дан 24 November 2019 в 01:51
поделиться

Они здесь в основном по историческим причинам. В настоящее время большинство современных клавиатур для большинства языков позволяют получить доступ ко всем этим символам, но раньше это было проблемой с некоторыми европейскими клавиатурами. Вот почему были изобретены триграфы.

Если вы не знаете, для чего они нужны, не используйте их.

Тем не менее, хорошо знать о них, поскольку вы можете случайно или непреднамеренно использовать их в своем коде.

2
ответ дан 24 November 2019 в 01:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: