[C] Zahlen aus Datei lesen

hi!
habe im Moment ein ähnl. Problem.
Ich möchte Zahlen aus einer Datei einlesen, die je durch ein return zeichen getrennt sind.
Habe jedoch probleme den richtigen Variablen Typ für mich zu finden.
Es sind Zahlen mit dem Format xxxx.xxxx
Die eingelesenen Zahlen müssten gespeichert werden (matrix?) und dann ALLE möglichen 2er Pärchen der Zahlen nacheinander in mein Unterprogramm geschickt werden.

Kann mir da wer helfen?
Das ganze ist etwas zu komplex für mich...
Danke!

mfG
 
Im moment steig ich aber echt nicht dahinter wie ich das genau mit der Speicherverwaltung machen soll damit er bei zu langen Zahlen keine Fehler ausspuckt
Kurz vor dem Wochenende mal eine, zugegeben nicht sehr elegante, aber dafür einfache Methode.
Du ermittelst einfach die Länge der gesamten Datei und reservierst den Speicher für diese Länge. Dann ist garantiert, dass jede Zeile hereinpasst:
C++:
#include <sys\stat.h>

// ...

FILE *fp = fopen("c:\\test.txt", "r");

if( fp )
{
    struct stat buf;

    if( fstat(fileno(fp), &buf) == 0  )
    {
        char *pBuffer = (char *)malloc(buf.st_size + 1);

        // ... zeilenweise einlesen und verarbeiten

        free(pBuffer);
    }
}

Wie kann ich die gleiche Zeile per strtok 2-mal durchlaufen ohne das Puffer Array vorher kopieren zu müssen, quasi den Lesezeiger wieder an den Anfang setzen.
Nimm nicht den Lesepuffer, sondern arbeite mit einem Zeiger darauf, den strtok() dann beliebig verstellen kann:
C++:
char* Token
char puffer[ZEILENLAENGE];

while(fgets(puffer, ZEILENLAENGE, datei))
{
    char *pBufferPtr = puffer;
    Token = strtok(pBufferPtr, ",\n");

    // ...
            
}

@derm35
Wenn jede Zahl in einer Zeile steht, ist das nicht so problematisch.
- Zeilenweise lesen.
- Das Format schaut aus wie ein Float- oder Double-Wert, daher mit "atof()" konvertieren.
- Ich hoffe, du bist nicht auf C beschränkt, dann könntest du nämlich die Zahlen in einem Objekt der Klasse "vector" speichern.

Was mit den "möglichen 2er Pärchen" gemeint ist, weiss ich allerdings nicht.

Gruß
MCoder
 
Vielen Dank schonmal!
Ich schreibe das ganze in c (visual studio).
Könntest du mir evtl. konkrete Befehle zum auslesen etc. geben?
Mit den Pärchen meine ich, dass das Prog. von allen eingelesenen Zahlen jeweils zwei herausnimmt und an das unterprogramm weitergibt. Dabei sollen alle mögl. Kombinationen der eingelesenen Zahlen nacheinander weitergegeben werden.

Danke!
 
Da ich von dem ersten Teil eigentlich kaum was verstehe ausser dass dort die gesamte länge der Datei ausgelesen wird und dann dementsprechend viel Speicher reserviert bin versteh ich davon nur Bahnhof :>

Wie zB sorge ich dann dafür dass dann auch nur in diesem reservierten Speicher gearbeitet wird? Wie würde dass zB aussehen wenn man mein oben beschriebenes Beispiel in dein Code einfügen würde? Mein Wissen über dynamische Speicherverwaltung und Zeiger ist leider nocht recht beschränkt :(

Und das mit strtok, krieg ich auch irgendwie nicht hin.
Ich habs unter anderem hiermit versucht, aber das klappt leider alles nicht :(

C++:
			Token = strtok(pBufferPtr, ",\n");
			while(Token != NULL) {
                       // mach etwas...
                *(pBufferPtr++);                         
				Token = strtok(NULL, ",\n");
			}
 
Zuletzt bearbeitet von einem Moderator:
C++:
char* Token
char puffer[ZEILENLAENGE];

while(fgets(puffer, ZEILENLAENGE, datei))
{
    char *pBufferPtr = puffer;
    Token = strtok(pBufferPtr, ",\n");

    // ...
            
}


Keiner eine Idee wie das genau funktionieren soll? das wäre echt wichtig für mich das zu wissen ::confused:
 
@n1smo
bei deinem ersten Problem würde die Zeile "char *pBuffer = (char *)malloc(buf.st_size + 1);" deiner Zeile "char puffer[ZEILENLAENGE];" entsprechen und du fügst dann einfach deine Schleife mit "fgets()" anstelle des Kommentares ein.

Habe mir gerade noch mal die Beschreibung zu "strtok()" angesehen, Meine Idee mit der Zeigervariable taugt leider nix, weil diese Funktion den Inhalt des Puffers ändert. Sie fügt anstelle des Trennzeichens ein Nullzeichen (Stringende) ein. Um das Kopieren des Puffers kommst du daher nicht herum.

@derm35
Stöbere einfach mal im Forum: Das Lesen von Daten aus Dateien wird hier ziemlich häufig behandelt. Auch aus diesem Thread kannst du zumindest schon mal das Auslesen (Funktionen: fopen() und fgets() ) herausziehen.
Bei dem Pärchenproblem solltest du mal versuchen, dir einen Algorithmus dafür zu überlegen, erstmal unabhängig von der konkreten Implementierung (Programmiersprache).

Gruß
MCoder
 
Danke nochmal für die Hilfe, aber das ändert doch nichts daran dass ich nach wie vor eine feste maximale Zeilenlänge definieren muss :(
 
Sag dem doch enfach, dass wenn (z.b. die #) kommt, ist eine Zeile zuende und danach kommt ein zeichen mit dem charcode 10(Absatz). Danach beginnt die neue Zeile.
 
Zuletzt bearbeitet:
Zurück