Автор Тема: Различия при два или повече файла в Qt4  (Прочетена 1243 пъти)

LinuxFanUNIX

  • Напреднали
  • *****
  • Публикации: 408
  • Distribution: Slackware 12.2
  • Window Manager: KDE 3.5.10
    • Профил
Добър вечер.

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

Имам папка например /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 да стане - ок, нямам претенции...  ;)

Благодаря предварително!
« Последна редакция: Jul 20, 2009, 00:30 от LinuxFanUNIX »
Активен

tyuio

  • Гост
Re: Различия при два или повече файла в Qt4
« Отговор #1 -: Jul 20, 2009, 10:49 »
http://search.cpan.org/
можели така ? :)
Активен

task_struct

  • Напреднали
  • *****
  • Публикации: 576
  • Distribution: Kubuntu 14.04
  • Window Manager: KDE 4.13
    • Профил
Re: Различия при два или повече файла в Qt4
« Отговор #2 -: Jul 20, 2009, 11:45 »
Както винаги отговорът е в документацията: http://doc.qtsoftware.com/4.5/qhash.html Нямам време вмомента да измисля точният алгоритъм, но смятам че ще стане сравнително лесно :)
Активен

"Minds are like parachutes. They only function when they are open." - James Dewar

irc.freenode.net  / #linux-bg

ANTIADMIN

  • Напреднали
  • *****
  • Публикации: 660
  • Distribution: Windows XP Pro latest updates
  • ANTIADMIN
    • Профил
Re: Различия при два или повече файла в Qt4
« Отговор #3 -: Jul 20, 2009, 12:19 »
Цецо, не мислиш ли че първо трябва да се научиш да програмираш?
таск структ, за какво ти е хеш като в случая се решава с array в array?
Тийо, какво искаш да кажеш с този линк? 
Активен

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: Различия при два или повече файла в Qt4
« Отговор #4 -: Jul 20, 2009, 15:05 »
Едва ли ще успея да дам предложение за Qt4, но в bash си има една красива команда diff за целта. Можеш да се зачетеш в документацията й ;)
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

lkr

  • Напреднали
  • *****
  • Публикации: 81
    • Профил
Re: Различия при два или повече файла в Qt4
« Отговор #5 -: 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.  
« Последна редакция: Jul 20, 2009, 15:47 от lkr »
Активен

tyuio

  • Гост
Re: Различия при два или повече файла в Qt4
« Отговор #6 -: Jul 21, 2009, 01:00 »
тъуио се казвам!
все си мисля че на някой ползващ пърл ще му се е наложило такова нещо, на тях все нещо им изниква за поправяне, пък и обичат да споделят.
Активен