Стиль C, потоки C ++ или Win32 API File I / O? - PullRequest
4 голосов
/ 02 июня 2011

Я прочитал C ++ Streams против ввода-вывода в стиле C? (среди прочих страниц), чтобы попытаться помочь мне решить, каким образом реализовать какой-либо файловый ввод-вывод в проекте, над которым я работаю.

Фон Я довольно новичок в программировании на C ++ и Windows, я традиционно работал в приложениях на C и командной строке. Заранее извиняюсь за неотложность этого вопроса.

Проблема Я хочу прочитать один текстовый файл, обработать его содержимое и вывести в другой (новый) текстовый файл. Я работаю в среде Win32 (и это не изменится в обозримом будущем) и пишу приложение, поддерживающее Unicode, с помощью макросов в стиле _T. «Обработка» может включать вставку / добавление / удаление строк текста, длина которых составляет не более 128 символов.

Вопрос Я предпочел бы написать что-то, что будет надежным, поэтому обработка ошибок ввода-вывода является соображением. Я думаю, что мне нужно держаться подальше от ввода-вывода файла в стиле C, если только по какой-то другой причине, кроме как для упрощения проверки кода и типов - то есть подход к этому в более OO POV. Каковы преимущества использования функций Win32 API перед потоковыми функциями C ++ (если есть)? Можете ли вы порекомендовать хороший учебник для любого подхода? (Мой поиск в Google оставил меня с небольшой информационной перегрузкой)

Большое спасибо

Ответы [ 4 ]

7 голосов
/ 02 июня 2011

Каковы преимущества использования функций Win32 API над функциями потока C ++ (если есть)?

  1. Скорость
  2. Возможность использования перекрывающихся операций ввода-вывода для одновременной обработки нескольких операций без потоков (и сложности синхронизации)
  3. Скорость
  4. Более конкретные коды ошибок
  5. Скорость
  6. Скорость
  7. Низкий след зависимости (по сравнению с MSVC ++ 7.x, 8.0, 9.0, 10.0 и, вероятно, большинством других поставщиков)
  8. Скорость
5 голосов
/ 02 июня 2011

Использование потокового ввода-вывода C ++. Запись в текстовые файлы вряд ли подчеркнет библиотеку ввода-вывода, и вы получите огромные преимущества в ясности кода, безопасности типов и в том, что вам вряд ли придется что-либо писать для выполнения работы. Как побочный эффект, ваш код, вероятно, будет более переносимым и более понятным, поэтому, если вам придется спросить об этом здесь, вы получите больше хороших ответов.

3 голосов
/ 03 июня 2011

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

Для всего, что Cost iostreams делает лучше, вы, вероятно, захотите взглянуть на Boost :: Spirit. Похоже, у него есть все типы безопасности iostreams, с гораздо лучшей производительностью.

У вас действительно есть две проблемы: файловый ввод / вывод и обработка текста. Win32 делает первое исключительно хорошо и не помогает со вторым. Boost :: Spirit отлично справляется со вторым. Iostreams C ++ незначительны в обеих задачах, избегайте их, если только переносимость не является наиболее важной функцией.

0 голосов
/ 04 июня 2011

Просто для того, чтобы обеспечить приблизительный тест - это код, который должен быть примерно самым неэффективным из возможных:

#include <iostream>
using namespace std;

unsigned int MB = 1024 * 1024;
unsigned int GB = MB * 1024;

int main() {
    char c = 'x';
    for ( unsigned int i = 0; i < GB; i++ ) {
        cout << c;
    }
}

Потребовалось около 4 минут, чтобы записать данные в текстовый файл при вызове:

myprog > file.txt

на моем современном ноутбуке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...