Работа со датотеки
QFile, QSettings
Често кога работи на одреден проект програмерот доаѓа во ситуација да прочита или запише одредена информација во датотека. Тоа може да се податоци кои ќе даваат информација која во повеќе наврати се повторува. На пример, нема потреба од постојано прашување на вашето име и презиме на секое активирање на програмата. Тоа може да се зачува во датотека и следниот пат програмата да го прочита од таа датотека тоа што му е потребно.
Овој пат ќе разгледаме две класи кои се грижат такви слични податоци да се зачуваат за покасно користење. QFile е класа која нуди секакви можности за манипулација со датотеки. Читање, запишување, отворање, проверка дали постои датотека, права на запис/читање и слично. Се она што може да се прави врз една датотека го обезбедува QFile. Како пример би навел неколку методи кои произлегуваат од оваа класа, name() - го дава името на датотеката, extists() - проверува дали датотеката постои, remove() - бриши датотека, open() - се обидува да отвори датотека – при што враќа true ако обидот е успешен и false ако не е. Има и методи преку кои може да се читаат податоци внесени под други кодни страни (cp1251, utf-8/16, итн.).
Следува мал пример за тоа како треба да се зачува текстот внесен во QLineEdit објект на наша програма во датотеката lineEdit.txt. За да не го пишувам цел стандарден код ќе ја напишам само класата која при повикување ја остварува целта која е потребна:
-
void ClassName::writeInFile()
-
{
-
QString stringRead(qLineEdit->text());
-
QFile file(lineEdit.txt);
-
-
if(file.open(IO_WriteOnly | IO_Append) {
-
QTextStream fileStream(&file);
-
fileStream<<stringRead<<endl;
-
file.close();
-
}
-
fileStream.unsetDevice();
-
}
Најпрво одредуваме еден објект од тип QString кој ја прима вредноста на објектот qLineEdit. Ова не е задолжително со таа разлика што наместо ‘fileStream‘ да ја вчита (<<) вредноста на stringRead, би ја вчитала вредноста на qLineEdit->text(). Заради тоа што QFile објектите може да се сметаат како објекти за манипулација со влезно/излезни единици (датотеките), користиме QTextStream за читање на вредностите кои произлегуваат од излезот на датотеките. Откако го правиме записот ја затвораме датотеката. Штом се отвора мора да се затвори, нели? И потоа го ослободуваме уредот (unsetDevice()). Тоа што би било внесено како вредност во QLineEdit објектот qLineEdit ќе биде запишано во датотеката lineEdit.txt. Кога го дефинираме објектот file, во конструкторот го ставаме името на датотеката. Ако нема патека за тоа каде се наоѓа датотеката, тогаш при извршување на извршната датотека од конзола, датотеката lineEdit.txt е креирана од тековниот директориум (најверојатно од директориумот на проектот), а доколку ја активираме со двоен клик тогаш датотеката ќе се креира во ~ (/home/user/) директориумот. Имаше еден мал проблем, впрочем не беше проблем како пропуст туку јас не знаев оти тоа е така. Откако ќе ја напишев патеката на датотеката и извршев запишување во неа (а изворната дадотека стартувана со двоен клик, konqueror), и покрај тоа што имаше цела патека, датотеката се запишуваше во мојот домашен директориум. Тогаш кога работев на проектот знаев зошто бидејќи најдов на Интернет некои информации, сега заборавив. Ако некој знае зошто нека каже.
Читањето е речиси идентично. Сами разгледајте и видете како би се остварило тоа. Да не повторувам ако имате прашања или нешто не разбирате од ова што го пишувам слободно контактирајте ме.
На ред дојде класата QSettings.
Тоа е класа со која се запишуваат вредности на подесувања. Пример, имате нешто вакво:
-
Име и презиме:
-
Поштенски број:
-
Пол:
-
Телефон:
Ова се типови на податоците кои најчесто се бараат (QString, int, bool). Замислете да ги внесувате секој пат кога активирате одредена програма. Начисто би полудел (дури и повеќе од сега). Дали ви се познати оние rc датотеки, својствени за речиси сите можни апликации што ги користите под ГНУ/Линукс. Тоа се конфигурациони датотеки во кои стојат податоци за програмата која ја поседува одередената датотека. Еве како би изгледала една таква за нашите податоци:
–
[name_surname]
name=Aleksandar
surname=Balalovski
[personal_data]
zipcode=7000
sex=1
phone=0800232312
Следниот пат програмата нема да ги поставува истите прашања, но ќе ги вчита од датотеката. Како што можиме да видиме, постојат две категории, name_surname и personal_data. Ако ги распоредиме како дрво тогаш тоа би изгледало вака:
-
-
name_surname/name
/surname
-
personal_data/zipcode
Сега да видиме што му е потребно на QSettings да знае за тоа што сакаме да го внесиме. Најпрво треба објект.
QSettings settings;
Потоа треба да го употребиме методот setPath(); од класата QSettings за да ги подесиме дополнителните информации, домен, производ и начин на запишување на информациите (Глобално или кориснички). Па така добиваме:
settings.setPath(“ApplicationName”, “www.app.org”, QSettings::Global);
Првиот аргумент е името на апликацијата, вториот е некој си домен не знам точно зошто овој аргумент служи но ете секогаш го ставам. Третиот му кажува на класата QSettings да ги запише податоците на глобално ниво. Така кон нив ќе може да пристапат и другите корисници на системот, но и ќе може да се читаат и кога апликацијата ќе се активира од конзола или со глувчето (двоен клик). Следува запишувањето на податоците што треба да се зачуваат:
settings.writeEntry(“/name_surname/name/”, “Aleksandar”);
settings.writeEntry(“/name-surname/surname/”, “Balalovski”);
settings.writeEntry(“/personal_data/zipcode”, 7000);
settings.writeEntry(“/personal_data/sex”, 1);
settings.writeEntry(“/personal_data/phone”, “0800232312”);
Одете во директориумот /home/username/.qt/ каде ќе ја најдете датотеката поврзана со името на вашата апликација. Отворете ја за преглед. Треба да изгледа како претходно опишаната ситуација:
[name_surname]
name=Aleksandar
surname=Balalovski
…итн.
Првиот, вториот и петтиот запис се од тип QString, третиот од тип integer, четвртиот тип boolean. Сега записите се зачувани. Што е потребно за да ги вчитате записите и да ги дадете на некоја променлива/објект? Методот readEntry(). Овој метод е предефиниран неколку пати, речиси за сите можни типови податоци што може да ги враќа. Како прв аргумент го прима елементот од кој треба да прочита вредност, а како втор дефинира стандардна вредност во случај елементот да нема вредност. За да ги прочитаме првиот третиот и четвртиот елемент од нашиот пример треба да го напишеме следниот код:
QString name=settings.readEntry(“/name_surname/name/”, “NemaIme”);
bool pol=settings.readEntry(“/personal_data/sex/”, 1);
int zipCode=settings.readEntry(“/personal_data/zipcode/”, 0);
Така објектот name ќе добие вредност “Aleksandar”. Ако немаше вредност „Aleksandar”, објектот name ќе добиеше вредност “NemaIme”, исто и со останатите два. Значи readEntry() може да чита QString, boolean, int и други типови податоци кои стојат во елементите кои претходно иницијализирани. Манипулирањето со податоците што ги внесувате и потоа вчитувате останува на вас, во зависност од потребите на вашата апликација.
-
Задача:
Напишете програма која ќе бара лозинка за авторизација на влез. Доколку лозинката е точна нека се појави QMessageBox дијалог со испис „Лозинката е точна“/”Lozinkata e tocna”.
Овие две класи се доволни за работа со информации што треба да ги чувате во датотеки. Но што ако е потребно да се добијат само информации за самата датотека. На пример, дали таа постои, дали има можност за запишување во неа па дури и да се избриши од дискот. За тоа се грижи класата QFileInfo. Таа дава едноставни информации за посочена датотека. Како што кажав, може да ви ги даде сите можни информации за датотека што ви требаат. Со оглед на тоа што оваа класа е навистина лесна нема да навлегувам во подробности. Еве еден мал пример за тоа како да проверите дали одредена датотека постои и која е нејзината наставка (екстензија):
QFileInfo fi( “/home/user/archive.tar.gz” );
if(fi.exists())
QMessageBox::information(this, “Application”, trUtf8(“Датотеката постои”));
else
QMessageBox::information(this, “Application”, trUtf8(“Датотеката не постои”));
QString extension;
extension=file.extension();
QMessageBox::information(this, “Application”, trUtf8(“Екстензијата е “+extension));
Информации на цел директориум и манипулација со директориуми, разгледајте ја класата QDir. Толку овојпат.
Александар Балаловски
aleksandar.balalovski AT gmail.com