Thomas Kramer

IT-COW | C-Aufgaben: Datensätze einlesen, zwei Varianten

C-Aufgaben: Datensätze einlesen, zwei Varianten

By Administrator at April 22, 2011 15:58
Filed Under: C(++), Programmierung allgemein, Studium

Zwei Varianten waren für diese Aufgabe gefragt, einmal sollte für das Speichern der Datensätze ein Array präferiert und das andere Mal eine verkettete Liste verwendet werden. Die zweite Variante implementiert außerdem eine (einfache) Suchen-Funktion.

 

Für die Daten wurde eine Datei mit festen Spaltenbreiten benutzt, ansonsten gibt es natürlich auch noch die andere Variante mit Komma- oder Semikolon-Separator.

 

Für die Bearbeitung von CSV-Dateien kann ich das Tool CSVed empfehlen, alternativ kann aber auch jede Tabellenkalkulation CSV-Dateien bearbeiten.

 

Variante 1

 

/*
* =====================================================================================
*
*       Filename:  
*
*    Description:
*
*        Version:  0.1
*        Created:
*       Revision:  none
*       Co mpiler:  gcc
*
*         Author:  Thomas Kramer
*        Company:
*
* =====================================================================================
*/

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <time.h>
#include <assert.h>
#include <string.h>
#include <fstream>
#include <strstream>
#include <string>
#include <iomanip>

using namespace std;

struct mitarbeiter {
  string identnummer;
  string nachname;
  string vorname;
  string abteilung;
  unsigned int durchwahl;
};

mitarbeiter Mitarbeiter[1000];

int main()
{
    ifstream ifs;
    char* datei;
    string buffer;
    int i=0;


    /*-----------------------------------------------------------------------------
     *  Datei öffnen
     *-----------------------------------------------------------------------------*/

    datei="C:\\Pfad\\Datendatei.dat";
    ifs.open(datei,ifstream::in);

    while (getline( ifs, buffer, '\n' ))
    {
      Mitarbeiter[i].identnummer = buffer.substr(0,8).c_str();
      Mitarbeiter[i].nachname    = buffer.substr(8,20).c_str();
      Mitarbeiter[i].vorname     = buffer.substr(28,20).c_str();
      Mitarbeiter[i].abteilung   = buffer.substr(48,4).c_str();
      Mitarbeiter[i].durchwahl   = atoi(buffer.substr(52.5).c_str());

      cout << setw(2) << i+1 << ". Datensatz -> ";
      cout << "ID: " << Mitarbeiter[i].identnummer << ' ';
      cout << "Nachname: " << Mitarbeiter[i].nachname << ' ';
      cout << "Vorname: " << Mitarbeiter[i].vorname << ' ';
      cout << "Abteilung: " << Mitarbeiter[i].abteilung << ' ';
      cout << "Durchwahl: " << Mitarbeiter[i].durchwahl << '\n';
      i+=1;
    }

    ifs.close();

    return 0;
}

 

Variante 2

 

Diese Variante benutzt den Pointer maNeu für das Speichern eines Datensatzes. Durch das wiederholte Instanziieren innerhalb der Schleife (auf den gleichen Variablennamen) wird der alte Datensatz nicht überschrieben, sondern nur ein neuer Speicherbereich zugewiesen.

 

ma ist hier der Listenanker, der das erste Element der verketteten Liste kennzeichnet. Bei der Nutzung eines Arrays wäre dies natürlich immer das nullte Element.

 

/*
* =====================================================================================
*
*       Filename:  
*
*    Description:
*
*        Version:  0.1
*        Created:
*       Revision:  none
*       Co mpiler:  gcc
*
*         Author:  Thomas Kramer
*        Company:
*
* =====================================================================================
*/

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <time.h>
#include <assert.h>
#include <string.h>
#include <fstream>
#include <strstream>
#include <string>
#include <iomanip>

using namespace std;

struct mitarbeiter {
  string identnummer;
  string nachname;
  string vorname;
  string abteilung;
  unsigned int durchwahl;
  mitarbeiter *next;
};

const int gesuchter_Wert=4777;

int main()
{
    ifstream ifs;
    char* datei;
    string buffer;
    int i=0;
    int t=0;

    mitarbeiter *ma     = 0;
    mitarbeiter *cursor = 0;

    /*-----------------------------------------------------------------------------
     *  Datei öffnen
     *-----------------------------------------------------------------------------*/

    datei="C:\\Pfad\\Datendatei.dat";
    ifs.open(datei,ifstream::in);

    while (getline( ifs, buffer, '\n' ))
    {
      mitarbeiter *maNeu  = new mitarbeiter;
      maNeu->identnummer  = buffer.substr(0,8).c_str();
      maNeu->nachname     = buffer.substr(8,20).c_str();
      maNeu->vorname      = buffer.substr(28,20).c_str();
      maNeu->abteilung    = buffer.substr(48,4).c_str();
      maNeu->durchwahl    = atoi(buffer.substr(52.5).c_str());
      maNeu->next         = NULL;

      if (ma == 0)
      {
          ma = maNeu;
          cursor = ma;
      }
      else
      {
          cursor->next = maNeu;
          cursor = cursor->next;
      }
    }
    ifs.close();

    cursor=ma;
    while (cursor!=NULL && cursor->next!=NULL && cursor->durchwahl!=gesuchter_Wert)
    {
      cursor=cursor->next;
    }

    if (cursor!=NULL && cursor->durchwahl==gesuchter_Wert)
    {
      cout << "Vorname: " << cursor->vorname << ' ';
      cout << "Nachname: " << cursor->nachname << ' ';
    } else {
      cout << "Datensatz nicht gefunden!";
    }

    for (cursor = ma; cursor!=0; cursor=cursor->next)
    {
        delete cursor;
    }
    ma = 0;
    return 0;
}

 

Kommentar schreiben




  Country flag
biuquote
  • Kommentar
  • Live Vorschau
Loading


Monats-Liste