Данные могут быть извлечены, если имеется по крайней мере три поля. Функция
В нашем втором примере с
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 }
Мы создаем для ввода и вывода данных объекты
Синтаксический анализ выполняется в цикле
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 }
В этом примере не нужен объект
tidy < cool.cpp > cooler.cpp
Эту программу можно легко расширить, позволяя ей работать с именами файлов, указанными в командной строке, если они заданы, а в противном случае использовать ее для фильтрации потока ввода