В качестве диплома, нужно написать на c++ "быстрый" конвертер odt->TeX, чем лучше писать в файл: стандартной библиотекой или winApi? и немного пояснить если можно
Re: Работа с файлами
От:
Аноним
Дата:
21.03.10 18:38
Оценка:
Здравствуйте, free.rFczZZ, Вы писали:
FR>В качестве диплома, нужно написать на c++ "быстрый" конвертер odt->TeX, чем лучше писать в файл: стандартной библиотекой или winApi? и немного пояснить если можно
Своими обёртками над стандартной библиотекой. Во первых кроссплатформенно, во вторых реализацию обёртки в дальнейшем можно заменить на что угодно, оставив при этом уже готовые интерфейсы. Но это если надо правильный велосипед, если нужен "лишь бы ездил" то можно не заморачиваться с обёртками и юзать стандартную библиотеку напрямую. "быстрый" понятие очень растяжимое, можно и ассемблерные вставки юзать — нифига не переносимо и не поддерживаемо в общем случае, зато быстро ).
Здравствуйте, free.rFczZZ, Вы писали:
FR>В качестве диплома, нужно написать на c++ "быстрый" конвертер odt->TeX, чем лучше писать в файл: стандартной библиотекой или winApi? и немного пояснить если можно
Учитывая, что диплом, то я бы использовал стандартную библиотеку, потому что кроссплатформено и потому что так ИМХО код чище будет, тем более что odt и тем более TeX в основном применяется под линуксом. По скорости ничего толкового сказать не могу, но я думаю, что запись на диск упрется в любом случае в скорость накопителя и что использовать WinAPI, с-style (printf, scanf etc.) или std::fstream абсолютно все равно.
Здравствуйте, free.rFczZZ, Вы писали:
FR>В качестве диплома, нужно написать на c++ "быстрый" конвертер odt->TeX, чем лучше писать в файл: стандартной библиотекой или winApi? и немного пояснить если можно
откуда такие жесткие требования к производительности??? в задании сказано что конвертер должен пропускать запредельно число гигабайт в секунду (например потому что это будет какойнить сервер где куча клиентов одновременно будет конвертить свои жоки в тех)??
я бы для начала просто написал бы хоть какой-то конвертор (по быстрой) используя только стандартные средства и без платформенно-зависимого кода... а потом после профилирования начал допиливать его до нужной производительности... и я более чем уверен что скорость записи на диск тут будет не первый bottle neck...
вопщем постарайся не отвлекаться от цели своего диплома скатываясь до незначительных деталей... я понимаю что над мелочами думать проще чем выстроить красивую архитектуру для проекта... как правило когда знакомишься с новой задачей в голове невольно всплывают мелкие идейки о том как можно клево сделать тот или иной кусочек с использованием уже имеющихся знаний (или какихнить клевых технологиях о которых прочитал недавно)... и студенты как правило бросаются кодить сначало то, что наиболее понятно (и внезапно на это тратится времени больше чем ожидалось )... а уже потом, как получится, доделать остальное... в результате дипломы сдаются с мокапами вместо скриншотов и некомпилябельным (и конечно же не рабочим) кодом проекта...
Здравствуйте, free.rFczZZ, Вы писали:
FR>В качестве диплома, нужно написать на c++ "быстрый" конвертер odt->TeX, чем лучше писать в файл: стандартной библиотекой или winApi? и немного пояснить если можно
Смотря как писать. Если небольшими блоками, то лучше использовать стандартную библиотеку C (fopen/fwrite/fread/fclose) или отображение на память. Потоки C++ в данном случае приведут к накладным расходам. В WinAPI отсутствует буферизация, из-за чего также получится значительное замедление. А если читать и писать весь файл разом, то никакого значения, только нужно учесть расход памяти.
Можно сделать обертку над API, как уже предложили, но там обязательно нужно будет делать буферизацию или писать большими выровнеными по размеру блоками. Вряд-ли этот код тоже является задачей диплома
Вот только функциях C есть ограничение: не получится читать/писать больше файлы на 32-х битной архитектуре. По крайней мере в стандартных функциях.
Здравствуйте, free.rFczZZ, Вы писали:
FR>В качестве диплома, нужно написать на c++ "быстрый" конвертер odt->TeX, чем лучше писать в файл: стандартной библиотекой или winApi? и немного пояснить если можно
А что такое стандартная библиотека? Обертка над WinAPI. Не верите — зайдите отладчиком внутрь fopen, _open и прочего такого. Дойдете все равно до CreateFile.
Сущность оборачивания заключается в межпоточной блокировке и отлове исключений и преобразовании их в коды ошибок CRT. А в случае с fstream — с преобразованием их обратно в исключения С++.
То есть, матрешка такая: fstream -> fopen -> CreateFile. Причем наибольший оверхед заключается в fstream.
Здравствуйте, dmitry_npi, Вы писали:
_>Здравствуйте, free.rFczZZ, Вы писали:
FR>>В качестве диплома, нужно написать на c++ "быстрый" конвертер odt->TeX, чем лучше писать в файл: стандартной библиотекой или winApi? и немного пояснить если можно
_>А что такое стандартная библиотека? Обертка над WinAPI. Не верите — зайдите отладчиком внутрь fopen, _open и прочего такого. Дойдете все равно до CreateFile. _>Сущность оборачивания заключается в межпоточной блокировке и отлове исключений и преобразовании их в коды ошибок CRT. А в случае с fstream — с преобразованием их обратно в исключения С++.
_>То есть, матрешка такая: fstream -> fopen -> CreateFile. Причем наибольший оверхед заключается в fstream.
Стандартная библиотека это набор стандартизированных интерфейсов к какой либо функциональности. И сущность оборачивания заключается в поддержке этих интерфейсов, то есть суть поддержке стандарта. Детали реализации никого не волнуют, хоть чего там внутрь засовывай но поведение по стандарту обеспечь. Я потому и посоветовал юзать стандартную либу но оборачивая необходимую функциональность в свои интерфейсы, что бы потом можно было внутренности менять если что. Эхх, горе от ума, слишком большое знание о деталях реализации ведёт к непреодолимому желанию сделать "грязный хак" там где мнение программиста не совпадает со стандартом, и это уже проблема.
Здравствуйте, free.rFczZZ, Вы писали:
FR>чем лучше писать в файл: стандартной библиотекой или winApi? и немного пояснить если можно
С точки зрения удобства, преимущество iostreams очевидно, поэтому вопрос, видимо, касется скорости. Наиболее долгой операцией является физическая работа с диском. Ещё, каждый вызов сервиса ОС (winApi) производит гораздо больше действий, чем, например, вызов виртуальной функции. Значит лучше так: накопить буфер некоторого оптимального для системы размера, а потом записать его на диск при помощи winApi. Наиболее сложно определить размер буфера — надо искать в подфоруме Win API соответствующие темы, думать, тестировать под разными ОС. Гораздо проще воспользоваться Стандартной библиотекой, где всё это уже сдалано за тебя. КОгда задача будет решена, и если останется время — почитай boost::asio
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, free.rFczZZ, Вы писали:
FR>В качестве диплома, нужно написать на c++ "быстрый" конвертер odt->TeX, чем лучше писать в файл: стандартной библиотекой или winApi? и немного пояснить если можно
Для твоей задачи — не сношает, пиши чем хочешь. Хотя мне лично милее стандартная библиотека