Жасмин Бланшет

Книги → QT 4: программирование GUI на С++ → Чтение и запись текста

QTextStream out(&file);

for (int row = 0; row < RowCount; ++row) {

for (int column = 0; column < ColumnCount; ++column) {

QString str = formula(row, column);

if (!str.isEmpty())

out << row << " " << column << " " << str << endl;

}

}

Мы использовали простой формат, когда одна строка соответствует одной ячейке, причем пробелы разделяют номер строки и номер столбца, а также номер столбца и формулу. Формула может содержать пробелы, но мы предполагаем, что она не может содержать ни одного символа '\n' (который используется для завершения строки). Теперь давайте рассмотрим соответствующий программный код, предназначенный для чтения файла:

QTextStream in(&file);

while (!in.atEnd()) {

QString line = in.readLine();

QStringList fields = line.split(' ');

if (fields.size() >= 3) {

int row = fields.takeFirst().toInt();

int column = fields.takeFirst().toInt();

setFormula(row, column, fields.join(' '));

}

}

Мы считываем одним оператором одну строку данных приложения Электронная таблица. Функция readLine() удаляет завершающий символ '\n'. Функция QString::split() возвращает список строк, разбивая строку на части согласно обнаруженным символам—разделителям. Например, при обработке строки «5 19 Total value» будет получен список из четырех элементов [«5», «19», «Total», «value»].

Данные могут быть извлечены, если имеется по крайней мере три поля. Функция QStringList::takeFirst() удаляет первый элемент списка и возвращает удаленный элемент. Мы используем ее для извлечения номеров строк и столбцов. Мы не делаем никакой проверки ошибок; если считываемый номер строки или номер столбца оказывается не числом, функция QString::toInt() возвратит 0. Вызывая функцию setFormula(), мы помещаем оставшиеся поля в одну строку.

В нашем втором примере с 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) {

← предыдущая следующая →

Страницы раздела: 1 2 3 4

Публикация компанией Dropbox кода Zulip – средства общения для IT-разработчиков

20.11.2015
Одной из одобрительно встреченных программистами инициатив, реализующихся в рамках акции Hack Week, стала публикация исходного кода приложения Zulip – веб-приложения для общения между собой разработчиков в сфере IT-технологий.

Объединение ОС Android и Chrome

17.11.2015
Слухи об объединении двух крупнейших ОС компании Google, Android и Chrome, гуляют по Интернету уже более 5 лет, но до сих пор этого не случилось, хотя очевидно, что с течением времени эти ОС становятся всё более похожими: так, в последнее время появилось немало Android-устройств, к которым прилагаются клавиатуры, а Chrome OS «научилась» работать с сенсорными экранами.

Конференция Linux Piter 2015

15.11.2015
Уже почти через неделю в Санкт-Петербурге впервые в истории пройдёт конференция, посвящённая проблемам свободного программного обеспечения – Linux Piter 2015.