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


Anmelden zum Antworten