Gelesene Daten Formatiert ausgeben
-
Hallo,
ich habe da mal eine Frage zum Umwandeln von Datentypen.
Ich habe ein struct DriveInfo, in dem diverse Infos zu den Systemlaufwerken gespeichert werden.
Dabei z.B. auch den Speicherplatz.
Die Funktion GetDriveInfo(int i) füllt das struct.Dazu einige Fragen:
1. Was ist QuadPart? Was macht es? Irgendwie verstehe ich die Doku dazu nicht.
2. Wenn ich einen Int in ein Static-Feld schreiben will, mache ich das so:
m_meinstatic.Format("%d", intwert);
Aber wie kann ich bei großen Zahlen die Trennzeichen erzeugen? z.B. aus 100000000 wird 100.000.000
3. Warum funktioniert das mit den Werten iDriveSize, iDriveFree und iDriveUsed nicht?
Eigentlich sollte da die Größe in Byte drin stehen, die ich dann mit * 1024 in KB oder noch weiter umrechnen kann.
Aber irgendwie erhalte ich immer falsche (manchmal auch negative Werte).// Struct DriveInfo: struct DriveInfo{ bool bDriveStatus; // Laufwerk bereit CString szDriveType; // Typ des Datenträgers CString szDriveLabel; // Datenträgerbezeichnung CString szDriveFilesystem; // Dateisystem CString szDriveletterFull; // Laufwerksbuchstabe, z.B. "A:\" CString szDriveletterOnly; // Laufwerksbuchstabe, z.B. A int iDriveSize; // Partitionsgröße in Byte int iDriveFree; // Partition - Frei in Byte int iDriveUsed; // Partition - Belegt in Byte ULONGLONG ullDiskSize; // Datenträgergröße in Byte int iDiskCylinder; // Laufwerk - Cylinder int iDiskSectorsTrack; // Laufwerk - Sektoren pro Track int iDiskBytesSector; // Laufwerk - Bytes pro Sector int iDiskTracksCylinder; // Laufwerk - Tracks pro Cylinder int iDiskSectors; // Laufwerk - Sektoren }; //Funktion GetDriveInfo void GetDriveInfo(int i){ DISK_GEOMETRY dg; ULONGLONG DiskSize; ULARGE_INTEGER nDummy, nTotalBytes, nFreeBytes; char szVolName[80], szFSName[80]; int drivenumber = drive[i].szDriveletterOnly[0] - 'A'; if(GetVolumeInformation(drive[i].szDriveletterFull , szVolName, 79, NULL, NULL, NULL, szFSName, 79)){ drive[i].bDriveStatus = true; GetDiskFreeSpaceEx(drive[i].szDriveletterFull, &nDummy, &nTotalBytes, &nFreeBytes); //... Ein Haufen anderer Code... drive[i].iDriveSize = nTotalBytes.QuadPart; drive[i].iDriveFree = nFreeBytes.QuadPart; drive[i].iDriveUsed = nTotalBytes.QuadPart - nFreeBytes.QuadPart; } else{ drive[i].bDriveStatus = false; } } // in der Main will ich die Werte aus drive[i].iDriveSize verwenden: m_partitioncapacity.Format("%d", drive[i].iDriveSize);
Bin für jeden Tipp dankbar.
mfg
trequ
-
Hi trequ,
Aber wie kann ich bei großen Zahlen die Trennzeichen erzeugen? z.B. aus 100000000 wird 100.000.000
Ich benutze immer folgende Funktion die ich in meiner AddFunctions (Additional Functions)-Klasse habe:
CString CAddFunctions::AddApostrophe(int n) { int n3 = 1000; int n6 = 1000000; int n9 = 1000000000; CString separated; switch((int)floor(log10(n)) / 3) { case 3: separated.Format("%d'%03d'%03d'%03d",n/n9,(n%n9)/n6,(n%n6)/n3,n%n3); break; case 2: separated.Format("%d'%03d'%03d",n/n6,(n%n6)/n3,n%n3); break; case 1: separated.Format("%d'%03d",n/n3,n%n3); break; case 0: separated.Format("%d",n); break; } return(separated); }
Wenn du jetzt also z.B. einen int-Wert mit Apostrophen versehen willst (oder halt mit Punkten, kannst du ändern wie du möchtest) brauchst du nur folgendes zu schreiben:
CString apoSizeKB = AddApostrophe(sizeKB); //'sizeKB' ist ein int-Wert CString apoSizeMB = AddApostrophe(sizeMB); //'sizeMB' ebenfalls
Und nicht vergessen math.h zu includen (aufgrund des floor und log10)
-
Hallo,
danke für den Code.
Ist ja eigentlich ganz einfach... Wenn man das Prinzip verstanden hat.
Damit ist jetzt immerhin 1 von 3 Problemen beseitigt.
mfg
trequ