Seite 1 von 1

Zwei QStrings vergleichen

Verfasst: 30. März 2006 20:03
von stefan-tiger
Hallo,

ich möchte zwei QStrings vergleichen.

Code: Alles auswählen

...
                QTextStream stream( &file );
        	QString line;

        	while ( !stream.atEnd() ) 
		{
            	 line = stream.readLine();
... 
                 std::cout << "serialnumber: #" << serialnumber.toStdString() << "# line: #" << line.toStdString() << "#" << std::endl; 
		 if(serialnumer==line) // funktioniert nicht
		 if( serialnumber.compare(line)==0  ) // funktioniert nicht
...
So klappt das allerdings nicht.

Hintergund: Ich muss aus einer ASCII-Datei eine Liste mit Seriennummern auslesen und mit einer schon ermittelten Seriennummer vergleichen.
Zur Kontrolle hab ich schon ausgaben auf der Konsole gemacht und immer ein "#" vor und Hinter dern String gehängt:

Code: Alles auswählen

serialnumber: #0000078C# line: ## IOWs PID and serial number which are QUBA devices (one per line)#
serialnumber: #0000078C# line: #1500 12345678#
serialnumber: #0000078C# line: #1500 0000078C#
serialnumber: #0000078C# line: #1500 88888888#
serialnumber: #0000078C# line: ## for older detection:#
serialnumber: #0000078C# line: #12345678#
serialnumber: #0000078C# line: #0000078C#
serialnumber: #0000078C# line: #88888888#
Bei der Zeile mit der Seriennummer 0000078C soll der Vergleich positiv werden.

Verfasst: 30. März 2006 21:42
von Adi
Wie wärs z.B. mit QString::contains?
Example:
QString str = "Peter Pan";
str.contains("peter", Qt::CaseInsensitive); // returns true

Verfasst: 30. März 2006 23:32
von stefan-tiger
Adi hat geschrieben:Wie wärs z.B. mit QString::contains?
Example:
QString str = "Peter Pan";
str.contains("peter", Qt::CaseInsensitive); // returns true
Würde evtl. gehn, aber wäre häßlich.

Warum funktionieren die Vergleiche nicht?

Verfasst: 31. März 2006 00:09
von FlorianBecker
Hallo,

ich kann das nicht so ganz nachvollziehen, warum sollte str1 == str2 nicht funktionieren?

Verfasst: 31. März 2006 06:46
von Christian81
FlorianBecker hat geschrieben:Hallo,

ich kann das nicht so ganz nachvollziehen, warum sollte str1 == str2 nicht funktionieren?
Weil evtl. die Kodierungen falsch sind - QIODevice ist ein Bytearray, also evtl. latin1/ascii
QString str("1234"); ist unicode.
Kann das sein?

Verfasst: 31. März 2006 07:09
von Adi
Dann müsste man das in Plaintext wandeln, oder?

Verfasst: 31. März 2006 19:23
von stefan-tiger
Hier mal zum selber probieren:

main.cpp

Code: Alles auswählen

// using Qt 4.1.1
#include <iostream>
#include <QString>
#include <QStringList>
#include <QFile>
#include <QTextStream>

int main(void)
{
 unsigned short sn[9];
 QString serialnumber;
 int numQuba;
 QString qubaSnt;

sn[0]=48;
sn[1]=48;
sn[2]=48;
sn[3]=48;
sn[4]=48;
sn[5]=55;
sn[6]=56;
sn[7]=67;
sn[8]=0;


 for (int j = 0; j < 9; j++)
      serialnumber[j] = sn[j];


	QStringList lines;
    	QFile file( "devices.ini" );
    	if ( file.open( QIODevice::ReadOnly ) ) 
	{
        	QTextStream stream( &file );
        	QString line;

        	while ( !stream.atEnd() ) 
		{
            	 line = stream.readLine();
		 std::cout << "serialnumber: #" << serialnumber.toStdString() << "# line: #" << line.toStdString() << "#" << std::endl; 
		 if(serialnumber==line)
		 //if( serialnumber.compare(line)==0  )
		 {
			std::cout << "detected device " << numQuba << ": #" << serialnumber.toStdString() << "# as QUBA device" << std::endl;
			qubaSnt=serialnumber;
			file.close();
			return 0;
		 }
		
            	 lines += line;
        	}
        file.close();
	}
	else
		std::cout << "ERROR: could not read devices.ini" << std::endl; 


 return -1;
}

devices.ini

Code: Alles auswählen

# IOWs PID and serial number which are QUBA devices (one per line)
1500 12345678
1500 0000078C
1500 88888888
# for older detection:
12345678
0000078C
88888888

Verfasst: 31. März 2006 19:33
von stefan-tiger
Lösung:

Code: Alles auswählen

 unsigned short sn[9];
 char csn[9];

...


 for (int j = 0; j < 9; j++)
      csn[j] = sn[j];
 serialnumber = csn;

...
if(serialnumber==line)
...