CSV Datei einlesen in Struct

Einlesen einer CSV Datei am Bsp. der magicNumbers.txt. Akademisch schlecht an dem Beispiel ist, das die beiden structs mit festem Längen ausgestattet sind. Der Speicher müsste dynamisch erzeugt werden mit realloc wie bei  der Variable magicNumbers.

magicNumbers.txt:
Adobe PDF;pdf;0x255044462d;evince %1
Postscript;ps;0x2521;evince %1
jpg, jpeg;jpg;0xffd8ffe0;gimp %1
header.h:

struct MagicNumbers
{
    char dateitTyp[20];
    char defaultExtension[4];
    char magicNumber[30];    
    char codeConsole[40];
};
struct MagicNumbersTableArray
{
    MagicNumbers magicNumbers[8];
};
MagicNumbersTableArray* readMagicNumbersFromFile(void);
file.cpp:

struct MagicNumbersTableArray* readMagicNumbersFromFile(void)
{

        char fileName[50] = MAGIC_FILE_NAME;

        FILE *file = NULL;
        struct MagicNumbers *magicNumbers = NULL;
        int x = 1;
        int i;

        file = fopen (fileName, "r");

        if (file == NULL)
        {
                cout << "Fehler beim Oeffnen von Datei: " << fileName << endl;
        }

        char line [500];
        fgets (line, sizeof(line) ,file );

        while(1)
        {

                magicNumbers = (struct MagicNumbers*) realloc(magicNumbers, x * sizeof(struct MagicNumbers));

                if(magicNumbers == NULL)
                {
                        cout << "Es konnte kein Speicher angelegt werden." << fileName << endl;
                }
                if(
                   fscanf(
                          file, "%[^;];%[^;];%[^;];%[^\n]\n", 
                          magicNumbers[x - 1].dateitTyp, 
                          magicNumbers[x - 1].defaultExtension, 
                          magicNumbers[x - 1].magicNumber, 
                          &magicNumbers[x - 1].codeConsole
                          ) == EOF)
                {
                        break;
                }
                x++;
        }
        struct MagicNumbersTableArray* magicNumbersTableArray = new MagicNumbersTableArray;
        for(i = 0; i < x - 1; i++)
        {
                printf("%s ,%s ,%s ,%s \n", 
                       magicNumbers[i].dateitTyp, 
                       magicNumbers[i].defaultExtension, 
                       magicNumbers[i].magicNumber, 
                       magicNumbers[i].codeConsole
                       );
                magicNumbersTableArray->magicNumbers[i] = magicNumbers[i];
        }
        free(magicNumbers);    
return magicNumbersTableArray;
}

Hexadezimal nach Asci Konvertierung

Um eine Zeichenkette in hexadezimaler Form in den entsprechenden ASCI Wert umzuwandeln, kann man die folgende Funktion verwenden:

unsigned char hexToAsci(char firstChar, char secondChar)
{
        char hex[2];
        unsigned int asci;
        hex[0] = firstChar;
        hex[1] = secondChar;
        sscanf(hex,"%x",&asci);
        return (unsigned char) asci;
}

Bsp:

cout << hexToAsci("2", "5"); // ergibt "%", weil hex "25" <=> ASCI "%", siehe http://www.torsten-horn.de/techdocs/ascii.htm

Teil 2: Clean Code – richtige und falsche Kommentare

Nach dem Buch (Kapitel 4):  “Clean Code – Refactoring, Patterns, Testen und Techniken für sauberen Code” von Robert C. Martin.

“Kommentieren Sie schlechten Code nicht – schreiben Sie ihn um.”

(Brian W. Kernighan und P.J. Plaugher)

 

Kommentare können beides sein, hilfreich und hinderlich:

  • hinderlich, wenn Sie überholt sind und Fehlinformationen liefern
  • störend, wenn Sie zu lang sind und unnötig
  • hilfreich, wenn Sie wohlplatziert sind

Der Einsatz von Kommentaren “soll unsere Unfähigkeit ausgleich, uns in unserem Code klar auszudrücken”(S.85). Bevor man einem Kommentar schreibt, sollte man vorher überlegen, ob der Code nicht noch ausdrucksstarker geschrieben werden könnte.

weiterlesen…

Code kopieren Zeilennummern löschen Regex

Beim Kopieren von Code von Webseiten(z.B. Zend.com) kann es vorkommen, dass der Code Zeilennummern enthält, z.B.

  1. // Parameters for ClientAuth authentication
  2. $service = Zend_Gdata_Gbase::AUTH_SERVICE_NAME;
  3. $user = “”;
  4. $pass = “pa$$w0rd”;
  5. // Create an authenticated HTTP client
  6. $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
  7. // Create an instance of the Base service
  8. $service = new Zend_Gdata_Gbase($client);
Um die Zeilennumern zu löschen, kann mit z.B. mit Netbeans folgenden Befehl ausführen:
STRG+H (SEARCH and REPLACE)
Find what: [0-9]{1,2}.\n
Replace with: (leer lassen)
Auswählen: Regular Expressions

Regular Expressions Netbeans

Teil 1: Clean Code – Regeln für guten, sauberen Code

Sauberen und leicht verständlichen Code zu schreiben ist das höchste Ziel in einem guten IT-Projet. Vieles hängt davon ab:

  • Wartbarkeit
  • Einarbeitungszeit für andere Programmierer, versteht man schnell, was einzelne Funktionen erledigen
  • Robustheit bei Änderungen
  • Testbarkeit, fällt alles zusammen, bei kleinen Änderungen, können schnell stabile Updates bereitgestellt werden
  • Popularität bei anderen Programmierern z.B: bei Open Source Projekten, als negative Beispiel sei XT-Commerce genannt

Das sehr zu empfehlende Standardwerk zu dem Thema ist “Clean Code – Refactoring, Patterns, Testen und Techniken für sauberen Code” von Robert C. Martin. In diesem Artikel werden Kapitel 1 bis 3 behandelt.

Aussagekräftige Namen

Der Namen einer Variable, Funktion oder Klasse sollte sofort erklären, warum Sie existiert, was sie tut und wie sie benutzt wird. Wenn eine Variable einen Kommentar benötigt, drückt Sie ihren Zweck nicht aus.

Bsp:

int d //Anzahl vergangener Tage
besser ist:
int daysSinceCreation;

Aussprechbare Namen verwenden

Keine Konstrukte mit unklaren Abkürzungen wie: int daSiCre anstatt von daysSinceCreation.

Suchbare Namen verwenden

Moderne IDEs machen das Suchen einfach, aber es nützt nichts, wenn man nach dem Buchstaben e einer Laufvariable suchen muss und von Ergebnissen überschwemmt wird.

Variablen Namen mit einem Buchstaben sind nur als lokale Variablen in kurzen Methoden zu verwenden.

weiterlesen…

Kinect SDK Tutorial Installation unter Windows 7

Um die Gestenerkennung der Xbox Kinect unter Windows nutzen zu können, kann man die Kinect an seinen PC anschließen und damit interagieren. Eine Kinect Quickstart Videosammlung von Microsoft gibt es hier.

Es ist zwingend Windows 7 oder Windows Embedded Standard 7 nötig für die Kinect Kamera und mindestens Dual-Core 2.66-GHz CPU und 2 GB Ram und natürlich ein USB 2.0-Steckplatz. Es läuft auf 32bit sowie 64bit Prozessoren.

Softwaretechnisch ist zwingend DirectX9.0c von Nöten, anderen Versionen sind nicht (abwärts) kompatibel.

Bei den Kinect Kameras gibt es 2 Versionen, eine normale “Xbox 360″ Version und eine “Kinect for Windows“- Profi Version (Preis aktuell: 200€ bei Amazon).

Die Vorteile der  Kinect for Windows zur Xbox Kinect

  • Near-mode“, mit dem man Daten aus einer Entfernung von min 40cm (1.3 feet)  empfangen kann, d.h. aus einer normalen PC-Arbeitsplatz-Entfernung. Die Standard Kinect arbeitet empfohlener Maßen bei einer Entfernung von um die 2m (1,8m – 3m, je nach Anzahl Personen)
  • Deutlich verbesserte Personenerkennung
  • Kontrolle, welche Person durch den Sensor getrackt werden soll
  • Zum Verwenden und Starten von kommerzieller Software (ausgenommen Xbox Spielen) benötigt man die Profi-Version, zum Entwickeln reicht jedoch die Konsolen-Variante aus.
  • unterstützt bis zu vier Kinect-Sensoren pro Computer
  • verbesserte Spracherkennung

Man kann die Versionen an dem Schriftzug auf dem Gerät unterscheiden: normal “XBOX 360″ rechts frontal, Profi-Near Version: “Kinect“.

Kinect for Windows:

normale Xbox Kinect Kauf Varianten:

Eine interessante Erweiterung für die Standard-Kinect ist die Kinect Zoom Weitwinkel-Linse. Damit können auch Entfernung von 0,8 bis 4m realisiert werden für einen niedrigen Preis. Die Qualität ist nicht besonders gut für Spiele, aber für Programme kann die Linse durchaus empfehlenswert sein.

Leider wird bei bei vor längerer Zeit gekauften Konsolen nicht unbedingt ein USB-Anschluss mitgeliefert, es muss also möglichweise erstmal ein Adapter her. Dieser kann entweder gekauft oder auf abenteuerliche Weise selber gebaut werden.

weiterlesen…