Bonjour,

Je suis actuellement en train de créer un module qui permet de lire dans un fichier (ci-dessous) et recréer un autre fichier avec uniquement ce qui m’intéresse: à savoir les hardware ID (une par ligne).

Voici un bout du fichier avant avec les éléments que je souhaite garder:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
ROOT\*ISATAP\0002
    Name: Carte Microsoft ISATAP #3
    Hardware IDs:
        *ISATAP
ACPI\THERMALZONE\THRM
    Name: Zone thermique ACPI
    Hardware IDs:
        ACPI\ThermalZone
        *ThermalZone
STORAGE\VOLUMESNAPSHOT\HARDDISKVOLUMESNAPSHOT6
    Name: Cliché instantané de volume générique
    Hardware IDs:
        STORAGE\VolumeSnapshot
ROOT\SYSTEM\0000
    Name: Énumérateur de périphérique logiciel Plug-and-Play
    Hardware IDs:
        root\swenum
ROOT\*ISATAP\0003
    Name: Carte Microsoft ISATAP #4
    Hardware IDs:
        *ISATAP
ACPI\INT3F0D\4&1D135828&0
    Name: Ressources de la carte mère
    Hardware IDs:
        ACPI\INT3F0D
        *INT3F0D
    Compatible IDs:
        *PNP0C02
Et voici à quoi ça devrait ressembler après traitement:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
*ISATAP
## // Indique qu'on passe à un nouvel Hardware
ACPI\ThermalZone
*ThermalZone
##
STORAGE\VolumeSnapshot
##
root\swenum
##
*ISATAP
##
ACPI\INT3F0D
*INT3F0D
Mon problème est selon moi ma compréhension de QTextStream. J'ai bien sur lu la doc, mais elle reste un peu compliqué à comprendre en anglais. Voici mon bout de code(attention aux yeux ):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
       QString filename = "hwids.txt";
       QFile fichier(filename);
       fichier.open(QIODevice::ReadOnly | QIODevice::Text);
       QTextStream flux(&fichier);
 
       QString ligne;
       QString fichierOut;
 
       while (! flux.atEnd())  // Tant qu'il y a des caractères dans le fichier
       {
           ligne = flux.readLine();
           if (ligne.contains ("Hardware IDs", Qt::CaseInsensitive))
           {
               ligne = flux.readLine();
               while ( ligne.contains ("        "), Qt::CaseSensitive)
               {
                   fichierOut += ligne + '\n';
                   fichierOut.resize(fichierOut.size()-1);
                   ligne = flux.readLine();
                   qDebug() << ligne;
               }
               fichierOut +=  '#' + '\n';
           }
       }
       qDebug() << fichierOut;
//  ...
//  ... fichierOut > fichierOut.txt
Mon premier problème est que ma boucle est infini.
J'utilise ici readLine() pour passer à la ligne suivante. C'est peut être une erreur?
contains() n'est peut être pas la meilleure fonction pour faire ce que je veux?
Il y a possiblement aussi un problème avec mon algo...

En tout cas, merci pour votre future aide.

Lanou, newbie c++ & Qt

Edit: Je travaille actuellement dessus avec startsWith() à la place de contains() qui me parait plus adapté et cela marche. Par contre je n'ai pas les retours à la ligne

APRES (En vert les éléments corrigés, en Rouge les éléments supprimés )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
       QString filename = "hwids.txt";
       QFile fichier(filename);
       fichier.open(QIODevice::ReadOnly | QIODevice::Text);
       QTextStream flux(&fichier);

       QString ligne;
       QString fichierOut;

       while (! flux.atEnd())  // Tant qu'il y a des caractères dans le fichier
       {
           ligne = flux.readLine();
           if (ligne.contains ("Hardware IDs", Qt::CaseInsensitive))
           {
               ligne = flux.readLine();
               while ( ligne.startsWith(("        "), Qt::CaseSensitive)
               {
                   fichierOut += ligne.trimmed() + '\n';
                   fichierOut.resize(fichierOut.size()-1);
                   ligne = flux.readLine();
                   qDebug() << ligne;
               }
               fichierOut +=  '#' + '\n';
               fichierOut += "##";
               fichierOut += '\n';
           }
       }
       qDebug() << fichierOut;
//  ...
//  ... fichierOut > fichierOut.txt
Et voici ce que ça donne pour le moment:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
        *ISATAP
##
        ACPI\ThermalZone
        *ThermalZone
##
        STORAGE\VolumeSnapshot
##
        root\swenum
##
        *ISATAP
##
        ACPI\INT3F0D
        *INT3F0D
##
        STORAGE\VolumeSnapshot
##
        BTHENUM\{dd533152-01f4-435c-abfe-984bc21a2a65}_LOCALMFG&0000
##
        ACPI_HAL\PNP0C08
        *PNP0C08
.......
Je ne pouvais pas ajouter plusieurs caractères dans mon QString avec des "+". Si quelqu'un pourrait m'expliquer pourquoi.. Merci!