Alles rund um die Programmierung mit Qt
stefan-tiger
Beiträge: 49 Registriert: 28. März 2006 22:52
Beitrag
von stefan-tiger » 30. März 2006 20:03
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.
Adi
Beiträge: 87 Registriert: 1. Januar 2006 14:51
Beitrag
von Adi » 30. März 2006 21:42
Wie wärs z.B. mit QString::contains?
Example:
QString str = "Peter Pan";
str.contains("peter", Qt::CaseInsensitive); // returns true
Win 2k, Win XP
QT Win Opensource 4.1.1
MinGW 3.4.2
stefan-tiger
Beiträge: 49 Registriert: 28. März 2006 22:52
Beitrag
von stefan-tiger » 30. März 2006 23:32
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?
FlorianBecker
Beiträge: 1213 Registriert: 2. Dezember 2004 10:54
Kontaktdaten:
Beitrag
von FlorianBecker » 31. März 2006 00:09
Hallo,
ich kann das nicht so ganz nachvollziehen, warum sollte str1 == str2 nicht funktionieren?
Christian81
Beiträge: 7319 Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:
Beitrag
von Christian81 » 31. März 2006 06:46
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?
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
Adi
Beiträge: 87 Registriert: 1. Januar 2006 14:51
Beitrag
von Adi » 31. März 2006 07:09
Dann müsste man das in Plaintext wandeln, oder?
Win 2k, Win XP
QT Win Opensource 4.1.1
MinGW 3.4.2
stefan-tiger
Beiträge: 49 Registriert: 28. März 2006 22:52
Beitrag
von stefan-tiger » 31. März 2006 19:23
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
stefan-tiger
Beiträge: 49 Registriert: 28. März 2006 22:52
Beitrag
von stefan-tiger » 31. März 2006 19:33
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)
...