C Programmierung aus datei als long einspeichern?
Hallo Leute,
Bei uns sind die Programmieren Tests so, dass wir alles per Hand schreiben müssen, daher ist bei den tests nur fiktive Dateien vorhanden, die wir im programm einlesen müssen.
Wir müssen die die Zahlen aus einer Datei in eine 99 Matrix speichern mit Hilfe einer for-schleife. Ich weiß leider nur wie ich es in char variablen einspeichern kann.
Kann mir jemand vllt helfen?
2 Antworten
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).
Das kannst Du nur, wenn das Daten- und Dateiformat bekannt ist - Das ist doch die Krux.
ich geh mal von einer txt datei aus, da ich maschinenbau studiere und die Anforderungen nicht so hoch sein sollten.
#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++;
}
}
}
strtod() sollte Dir da helfen können, ein einfacher Cast kann natürlich nicht klappen.
long double strtold(const char *nptr, char **endptr);
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.
Habe gerade eben auch mit atoi(...) probiert gehabt und es hat tatsächlich geklappt :) danke
Allerdings ist atoi auf den Wertebereich eines int beschränkt - nur zur Erinnerung ;-).
Das ist auch mein aktuelles Problem :) atof funktioniert aber nicht... da stehtt dann "Conflicting types for 'atof'"
wie blöd von mir :) hatte die library nicht eingefügt... hat sich vorerst geklärt :) danke
asciitointeger -> atoi
asciitolong -> atol (L wie Ludwig)
atof ist ja auch für Floatingpointwerte (konvertiert zu double)
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?
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
und dann halt matr[i][j] = irgendwas; in die schleife
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.
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