Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: LinuxFanUNIX в Jul 20, 2009, 00:28



Титла: Различия при два или повече файла в Qt4
Публикувано от: LinuxFanUNIX в Jul 20, 2009, 00:28
Добър вечер.

Бихте ли ми помогнали за решаването на следния проблем?

Имам папка например /home/user/files/
Вътре обаче има неизвестен брой файлове.
До тук добре.

Код
GeSHi (C++):
  1. QDir dir;
  2. int count = dir.count()

Записвам съдържанието в QStringList:
Код
GeSHi (C++):
  1. QStringList dirList = dir->entryList(QDir::Files);

Обаче сега идва най-трудното.
Например избирам си файла a.txt.
По какъв начин мога да направя така че да се прочетат всички останали файлове и в QStringList да се запишат само различията между тях?

Пример:
Имам файлове a.txt b.txt и c.txt
В int count ще се зададе цифра 3 (т.е. съдържа 3 файла).

Ето и примерно съдържание на трите файла:

a.txt:
GSM: 123...
GSM: 234...

b.txt:
GSM: 123...
GSM: 132...
GSM: 222...
GSM: 444...

c.txt:
GSM: 222
GSM: 123

Така ако си хвана a.txt трябва да получа следното:
234 (тъй като GSM: 234 се съдържа само веднъж)

b.txt:
132, 444 (тъй като 132 и 444 се съдържат само веднъж)

И в c.txt не трябва да върне нищо тъй като GSM-а се съдържа и в останалите два файла (т.е. няма различия)

Ако може и на bash да стане - ок, нямам претенции...  ;)

Благодаря предварително!


Титла: Re: Различия при два или повече файла в Qt4
Публикувано от: tyuio в Jul 20, 2009, 10:49
http://search.cpan.org/
можели така ? :)


Титла: Re: Различия при два или повече файла в Qt4
Публикувано от: task_struct в Jul 20, 2009, 11:45
Както винаги отговорът е в документацията: http://doc.qtsoftware.com/4.5/qhash.html Нямам време вмомента да измисля точният алгоритъм, но смятам че ще стане сравнително лесно :)


Титла: Re: Различия при два или повече файла в Qt4
Публикувано от: ANTIADMIN в Jul 20, 2009, 12:19
Цецо, не мислиш ли че първо трябва да се научиш да програмираш?
таск структ, за какво ти е хеш като в случая се решава с array в array?
Тийо, какво искаш да кажеш с този линк? 


Титла: Re: Различия при два или повече файла в Qt4
Публикувано от: neter в Jul 20, 2009, 15:05
Едва ли ще успея да дам предложение за Qt4, но в bash си има една красива команда diff за целта. Можеш да се зачетеш в документацията й ;)


Титла: Re: Различия при два или повече файла в Qt4
Публикувано от: lkr в Jul 20, 2009, 15:46
Код
GeSHi (C++):
  1. #include <QDir>
  2. #include <QStringList>
  3. #include <QHash>
  4. #include <iostream>
  5.  
  6. QHash<QString, int> hash;
  7. QString pick("c.txt");
  8.  
  9. void pick_that(const QDir& dir)
  10. {  
  11.    QFile file(dir.filePath(pick.toLocal8Bit().constData()));
  12.    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
  13.        qWarning("Cannot open file");
  14.        return;
  15.    }
  16.  
  17.    while (!file.atEnd()) {
  18.        QString line = file.readLine();
  19.        QStringList l = line.trimmed().split(" ");
  20.        hash.insert(l[1], 1);
  21.    }
  22.    file.close();
  23. }
  24.  
  25. int main()
  26. {  
  27.    QDir dir("tt");
  28.    QFile file;
  29.    QStringList fileList = dir.entryList(QDir::Files);
  30.    QStringList::const_iterator i;
  31.    QString line;
  32.    QStringList l;
  33.    QFile f;
  34.  
  35.    if (!dir.exists()) {
  36.        qWarning("Cannot find the directory");
  37.        return 1;
  38.    }
  39.  
  40.    pick_that(dir);
  41.  
  42.    for (i = fileList.begin(); i != fileList.end(); ++i) {
  43.        QString name = (*i).toLocal8Bit().constData();
  44.  
  45.        if (name == pick)
  46.            continue;
  47.  
  48.        QFile f( dir.filePath(name) );
  49.  
  50.        if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) {
  51.            qWarning("cannot open file");
  52.            return 1;
  53.        }
  54.  
  55.        while (!f.atEnd()) {
  56.            line = f.readLine();
  57.            l = line.trimmed().split(" ");
  58.            if (hash.contains(l[1]))
  59.                hash[l[1]] = 0;
  60.        }
  61.        file.close();
  62.    }
  63.  
  64.    QHash<QString, int>::const_iterator j = hash.constBegin();
  65.    while (j != hash.constEnd()) {
  66.        if (j.value() != 0)
  67.            std::cout << j.key().toLocal8Bit().constData() << std::endl;
  68.        ++j;
  69.    }
  70. }
  71.  


Титла: Re: Различия при два или повече файла в Qt4
Публикувано от: tyuio в Jul 21, 2009, 01:00
тъуио се казвам!
все си мисля че на някой ползващ пърл ще му се е наложило такова нещо, на тях все нещо им изниква за поправяне, пък и обичат да споделят.