0 Daumen
84 Aufrufe

Ich bin gerade ziemlich überfordert, denn ich kenne mich mit dem Thema "Filezugriffe" nicht so gut aus.

Ich muss eine Datei einlesen und die Daten in ein dynamisches Strukturfeld umspeichern. Zu diesem Zweck wird die Datei zweimal durchlaufen. Zuerst um mitzuzählen, wie viele Datensätze (nur nicht-korrupte!) gültig sind, um dafür dynamisch Platz anzufordern. Danach durchläuft man die Datei ein zweites Mal und wandelt jede verwertbare Zeile in ein entsprechendes Datenelement um und speichert dieses in dem dynamischen Feld. Der Name der Datei ist über die Kommandozeile zu übernehmen.

Die Struktur sieht folgendermaßen aus:


typedef struct telefon {
    char imeiNummer[20];
    char bezeichnung[100];
    int speicherInGB;
    double preis;
} handy_t;

Hilfe jeglicher Art wäre spitze!

von

Hallo Jason,

Zu diesem Zweck wird die Datei zweimal durchlaufen.

Ist das eine Vorgabe aus der Aufgabenstellung. Notwendig wäre es nicht!


In welcher Programmiersprache soll dies geschehen. Die Struktur oben könnte C sein, C++ wäre aber auch möglich.

Das ganze soll in C geschehen und ja, das ist eine Vorgabe der Aufgabenstellung.

Ok - aber das wichtigste hatte ich vorhin vergessen: wie sieht das Format der Datei aus? Kannst Du vielleicht mal 2 bis 3 Datensätze aus der Datei hier posten.

Es ist eine Excel-CSV-Datei:

Emei-NummerBezeichnungSpeichergrößePreis
12345678909876500Samsung Galaxy S38299.9
9837549375987430000LG G3 4G/LTE16319.0blau
913467787824872000Nokia Lumia 6354199

Hallo Jason,

:-) das ist keine Datei, sondern eine Tabelle.

Eine CSV-Datei kann unterschiedliche Formate haben. CSV steht für Comma Separatad Values. Im deutschen wird aber das Komma ungern als Elementrenner genommen, da es sich mit dem Komma als Dezimaltrenner von Zahlen beißt. Man kann aber auch Leerzeichen zwischen den einzelnen Feldern lassen, das kommt ganz darauf an, was man beim Abspeichern der Datei angibt.

Ein Programm - speziell ein C-Programm - liest Zeichen bzw. Bytes aus einer Datei. Man tut gut daran, dass diese Zeichen bzw. Bytes einen (von Menschen!) lesbaren Text darstellen. Das ist keineswegs selbstverständlich.

Öffne doch bitte diese Datei mal mit dem Programm Notepad, dann kannst Du das Format der Datei besser sehen ...

EMEI-Nummer;Bezeichnung;Speichergröße;Preis

12345678909876543;Samsung Galaxy S3;8;299.9

9387549375987435348;LG G3 4G/LTE+;16;319.0;blau

913467787824872986;Nokia Lumia 635;4;199

1 Antwort

0 Daumen

Hallo Jason,

leider bin ich nicht mehr so fit, was das Lesen in C angeht (ist schon mehr als 25 Jahre her!). Im Prinzip sollte es so funktionieren:

#include <stdio.h>

typedef struct telefon {
    char imeiNummer[20];
    char bezeichnung[100];
    int speicherInGB;
    double preis;
} handy_t;

int lese_datei( char* fnname, handy_t* feld)
{
    FILE* fp;
    int anzahl;
    int erste_zeile;
    char* ret;
    char zeile[120];

    fp = fopen(fnname, "r");
    if(fp == NULL)
    {
        // Fehler
        return 0;
    }
    erste_zeile = 1;
    anzahl = 0;
    for(;; ++anzahl)
    {
        ret = fgets(zeile, 120, fp);
        if( ret == NULL )
        { 
            break; /* Dateiende erreicht! */
        }
        if(erste_zeile == 0)
        {
            /* hier jetzt den String 'zeile' zerlegen und prüfen */
            if( feld != NULL)
            {
                /* nach erfolgreicher Zuweisung 'feld' um 1 erhöhen */
            }
        }
        else
        {
            erste_zeile = 0;
        }
    }
    fclose(fp);
    return anzahl;
}

int main() {
    char* fname;
    int anzahl;
    handy_t* feld;

    fname = "input.txt"; /*hier den Dateinamen angeben*/
    anzahl = lese_datei(fname, NULL);
    if(anzahl > 0)
    {
        /* Array mit Größe 'anzahl' anlegen*/
        feld = malloc( ...;
        lese_datei(fname, feld); /*zweites mal lesen*/
    }
    else
    {
        /*Fehler !*/
    }
    return 0;
}

an der Stelle 'feld != NULL' kannst Du zwischen dem ersten und zweiten Durchlauf der Funktion unterscheiden. Im ersten Durchlauf passiert nichts und im zweiten werden die Daten bei *feld gespeichert.

Falls noch Fragen sind, so melde Dich bitte.

Gruß Werner

von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage sofort und kostenfrei

x
Made by a lovely community