Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

В нашем втором примере с QTextStream мы будем посимвольно считывать текстовый файл и затем выводить этот же текст, удаляя из строки завершающие пробелы и заменяя символы табуляции пробелами. Всю эту работу делает функция tidyFile:

01 void tidyFile(QIODevice *inDevice, QIODevice *outDevice)

02 {

03 QTextStream in(inDevice);

04 QTextStream out(outDevice);

05 const int TabSize = 8;

06 int endlCount = 0;

07 int spaceCount = 0;

08 int column = 0;

09 QChar ch;

10 while (!in.atEnd) {

11 in >> ch;

12 if (ch == '\n') {

13 ++endlCount;

14 spaceCount = 0;

15 column = 0;

16 } else if (ch == '\t') {

17 int size = TabSize - (column % TabSize);

18 spaceCount += size;

19 column += size;

20 } else if (ch == ' ') {

21 ++spaceCount;

22 ++column;

23 } else {

24 while (endlCount > 0) {

25 out << endl;

26 --endlCount;

27 column = 0;

28 }

29 while (spaceCount > 0) {

30 out << ' ';

31 --spaceCount;

32 ++column;

33 }

34 out << ch;

35 ++column;

36 }

37 }

38 out << endl;

39 }

Мы создаем для ввода и вывода данных объекты QTextStream, полученные на базе устройств QIODevice, переданных конструктору. Мы поддерживаем три переменные для контроля состояния: счетчик новых строк, счетчик пробелов и текущую позицию столбца в текущей строке (для преобразования символов табуляции в правильное количество пробелов).

Синтаксический анализ выполняется в цикле while, на каждом шаге которого считывается из входного файла один символ. В этой функции в некоторых местах делаются тонкие вещи. Например, хотя TabSize устанавливается на значение 8, мы заменяем символы табуляции достаточно точным числом пробелов, чтобы достигнуть следующей метки табуляции, а не грубо заменять каждый символ табуляции восемью пробелами. При встрече символа новой строки, символа табуляции и пробелов мы просто обновляем состояние данных. Только при получении символа нового вида мы выполняем вывод данных, а перед записью символа записываем ожидающие вывода символы новой строки и пробелы (чтобы учесть пробельные строки и сохранить отступы) и обновляем состояние.

01 int main

02 {

03 QFile inFile;

04 QFile outFile;

05 inFile.open(stdin, QFile::ReadOnly);

06 outFile.open(stdout, QFile::WriteOnly);

07 tidyFile(&inFile, &outFile);

08 return 0;

09 }

В этом примере не нужен объект QApplication, потому что мы используем только инструментальные классы Qt. Список всех инструментальных классов приводится на веб-страницеМы предполагаем, что эта программа используется как фильтр, например:

tidy < cool.cpp > cooler.cpp

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

Поскольку это приложение консольное, его файл .pro немного отличается от используемого нами в приложениях с графическим интерфейсом:

TEMPLATE = app

QT = core

CONFIG += console

CONFIG -= app_bundle

SOURCES = tidy.cpp

Мы собираем приложение только с QtCore, поскольку здесь не используется функциональность графического пользовательского интерфейса. Затем мы указываем, что необходимо включить консольный вывод в Windows и не нужно размещать приложение в каталоге (bundle) приложений системы Mac OS X.

При чтении и записи простых ASCII—файлов и файлов с кодировкой ISO 8859-1 (Latin-1) можно непосредственно использовать программный интерфейс QIODevice вместо класса QTextStream. Поступать так имеет смысл только в редких случаях, поскольку в большинстве приложений требуется в некоторых случаях поддержка других кодировок и только QTextStream обеспечивает такую поддержку безболезненно. Если вы все-таки хотите писать текст непосредственно на устройство QIODevice, необходимо явно указать флажок QIODevice::Text в функции open, например:

  • Читать дальше
  • 1
  • ...
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: