C Programmierung aus datei als long einspeichern?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Es kommt ja darauf an, wie das Datenformat der Datei ist. textuell? ein direkter Dump in korrekter Endianess?

Grundlegend würdest Du die Werte in einer Schleife einlesen, wie genau diese auszusehen hat, bestimmen die unbekannten Faktoren, aber Du kannst nach folgendem Muster vorgehen:

for (int i=0;i<m;++i){
    for (int j=0;j<n;++j){
        matrix[i][j]=get_long();
    }
}

Wobei getlong die Aufgabe hat den nächsten Longwert in Abhängigkeit des Datenformats zu extrahieren.

(Merke, wenn es ( get_long() ) nicht ein Einzeiler wird, dann ergibt es meist Sinn, die Funktionalität getrennt als Funktion zu kapseln).

Nobody2019 
Fragesteller
 23.01.2020, 17:26

Bei der Aufgabe steht datei name wäre hugo.dat

Ich habe jetzt ein Arry deklariert namens long matr[N][N]; wobei N am anfang als 9 definiert wurde.

mit FILE *fp;

fp = fopen("pfad","r");

habe ich die Datei geöffnet.

wie ich das mit der schleife Handhabe ist mir auch relativ klar. 2 for-schleifen, die jeweils N-mal durchgehen.

und nun bin ich mir unsicher wie ich es aus der Datei einspeichern kann

matr[i][j] = dereingelesen wert; aber wie ich den wert aus der Datei ansprechhe ist mir unklar

0
Nobody2019 
Fragesteller
 23.01.2020, 17:28
@KarlRanseierIII

ich geh mal von einer txt datei aus, da ich maschinenbau studiere und die Anforderungen nicht so hoch sein sollten.

0
Nobody2019 
Fragesteller
 23.01.2020, 17:47
@KarlRanseierIII

#include <stdio.h>

#include <string.h>

#define N 9

#define DATEI "hugo.dat"

int main(){

   long matr[N][N];

   long vek1[N];

   long vek2[N];

   FILE *fp;

   char buffer[255];

   fp = fopen("pfad", "r");

int q = 1; // als zähler

   for(int i = 0; i < N ; i++){

       for(int j = 0; j < N; j++){

           fgets(buffer, 255,fp);

           printf("%d Test %s \n",q, buffer); // als char einlesen und ausgeben klappt

           matr[i][j] = (long)buffer; //klappt leider nicht

            printf("\n\n %.2lf \n\n", matr[0][1]); // In long konvertieren leider nicht

           q++;

       }

   }

}

0
KarlRanseierIII  23.01.2020, 19:47
@Nobody2019

strtod() sollte Dir da helfen können, ein einfacher Cast kann natürlich nicht klappen.

long double strtold(const char *nptr, char **endptr);
0
KarlRanseierIII  23.01.2020, 19:51
@KarlRanseierIII

Mein Fehler, Integralwert: atol():

#include <stdlib.h>

long atol(const char *nptr);

Was man nicht im Kopf hat, hat man in der Doku :-P.

Oder eben auch:

#include <stdlib.h>

long int strtol(const char *nptr, char **endptr, int base);

Je nach benötigtem Anwendungszweck.

0
Nobody2019 
Fragesteller
 23.01.2020, 20:10
@KarlRanseierIII

Habe gerade eben auch mit atoi(...) probiert gehabt und es hat tatsächlich geklappt :) danke

0
KarlRanseierIII  23.01.2020, 20:12
@Nobody2019

Allerdings ist atoi auf den Wertebereich eines int beschränkt - nur zur Erinnerung ;-).

1
Nobody2019 
Fragesteller
 23.01.2020, 20:22
@KarlRanseierIII

Das ist auch mein aktuelles Problem :) atof funktioniert aber nicht... da stehtt dann "Conflicting types for 'atof'"

0
Nobody2019 
Fragesteller
 23.01.2020, 20:52
@Nobody2019

wie blöd von mir :) hatte die library nicht eingefügt... hat sich vorerst geklärt :) danke

0
KarlRanseierIII  23.01.2020, 20:52
@Nobody2019

asciitointeger -> atoi

asciitolong -> atol (L wie Ludwig)

atof ist ja auch für Floatingpointwerte (konvertiert zu double)

1

Z.B. so:

//Datei -> long
FILE *f = fopen("foobar.baz", "r");
long irgendwas;
fread(&irgendwas, sizeof(long), 1, f);
fclose(f);

//long -> Datei
FILE *f = fopen("foobar.baz", "w");
long irgendwas = 12345678;
fwrite(&irgendwas, sizeof(long), 1, f);
fclose(f);

Oder geht es um Textdaten?

Nobody2019 
Fragesteller
 23.01.2020, 16:43

Dateiname ist hugo.dat

0
Nobody2019 
Fragesteller
 23.01.2020, 16:46

long irgendwas kann auch long matr[9][9]; sein? und dann halt das mit fread in eine schleife packen bzw. 2 schleifen?

for(int i = 0; i < N ; i ++){

for(int j = 0; j < N; j++){

fread(&irgendwas, sizeof(long), 1, f);

}

}

so?

N ist #define N 9

0
Nobody2019 
Fragesteller
 23.01.2020, 16:47
@Nobody2019

und dann halt matr[i][j] = irgendwas; in die schleife

0
Isendrak  23.01.2020, 22:13
@Nobody2019

Nicht unbedingt.

Es kommt u.a. drauf an, wie die Datei aufgebaut ist.

Ist es eine Textdatei (CSV, TSV, etc...), evtl. auch einfach ein Wert je Zeile oder sonstwas?

Oder ist es eine Binärdatei, in der die Werte in Byteform einfach direkt hintereinander stehen?

Wenn es sich um Szenario 2 handelt, kommt es auch noch darauf an, ob die Werte "zeilen-" oder "spaltenweise" angeordnet sind.

Für Szenario 2, angenommen die Werte sind "zeilenweise angeordnet:

long matrix[9][9];
FILE *f = fopen("hugo.dat","r");
for(int zeile = 0; zeile < 9; ++zeile){
    fread(matrix[zeile], sizeof(long), 9, f);
}
fclose(f);

Aber wie ich (und auch KarlRanseierIII) bereits sagte(n): Es kommt darauf an, in welchem Format die Daten in der Datei stehen. Ohne diese Angabe wird das ganze im besten Fall ein Schuss ins blaue, schlimmstenfalls ein Griff ins Klo.

0