fwrite/fread problem
-
Hallo,
Warum funktioniert folgender Code nicht.
Der schreibt mir in die Datie nur Vierecke und ein komisches zeichen rein.
Der liest size iwie dann auch richtig aus, aber nicht den Vektor...void write1Dfield(const char* fileName, REAL* field, int size){ FILE * pFile; int A[1]; A[0]=size; pFile = fopen ( fileName, "wb" ); fwrite (A, sizeof(int) , 1, pFile ); fwrite (field , sizeof(REAL) , size, pFile ); fclose (pFile); } void write2Dfield(const char* fileName, REAL** field, int sizeX, int sizeY){ } REAL* read1Dfield(const char* fileName, int* size){ FILE * pFile; REAL* V; V=create1Dfield(*size); pFile = fopen ( fileName, "rb" ); fread (size,sizeof(int), 1, pFile); fread (V,sizeof(REAL),*size , pFile); fclose (pFile); return V; }
Würde mich über Hilfe freuen.
Grüße
-
Slabic schrieb:
Der schreibt mir in die Datie nur Vierecke und ein komisches zeichen rein.
Wahrscheinlich sehen die Daten so aus, wenn man sie als Zeichen interpretiert.
Slabic schrieb:
Der liest size iwie dann auch richtig aus, aber nicht den Vektor...
Wie äussert sich das? Wenn size stimmt, sollte das gehen.
-
Hallo, danke für deine Antwort.
Hab' grad noch was rumprobiert, und gemerkt, dass der Vektor tatsächlich doch gelesen wird.
Nur komischerweise stürzt das Programm restliche Programm (was aus simplen Matrix-vektormult. und SKP,etc. besteht)ab, wenn ich
write1Dfield("bla.txt", x, 10); TEST_V=read1Dfield("bla.txt",size); cout << *size; for(i=0;i<10;i++){ cout << TEST_V[i]; }*/
hinzufüge, obwohl der den Vektor TEST_V bis dahin erstmal richtig ausgibt.., Ohne diesen Code läuft's....raff ich grad nicht, weil ich veränder x,y nicht, noch die anderen Variablen...
-
Dazu bist du hier eigentlich nicht ganz richtig, wegen dem C++-Zeug. Man soll in C++ prinizpiell entweder die Datei-Streams oder die C-Funktionen verwenden, wenn man die beiden vermischt, können seltsame Dinge passieren. Vielleicht liegt's daran.
-
Eigentlich benutze ich halt nur cout... aber ok, hab jetzt alle durch printf ersetzt...
printf("%i",*size);
for(i=0;i<10;i++){
printf("%f", TEST_V[i]);aber stürzt immernoch ab, könnte es daran liegen, dass meine dateien c++ sind, also z.b. main.c++, etc.?
-
Nachdem du nun schon auch den aufrufenden Kontext genannt hast, fehlt bloß noch die Definition von size, ich nehmen mal an, es wird
int size;
sein.
Dann ist aberTEST_V=read1Dfield("bla.txt",size);
falsch, und es muss heissen:
TEST_V=read1Dfield("bla.txt",&size);
-
Das ist ein guter Verdachtsfall für einen Absturz. Hat der Compiler diesen Typfehler nicht bemerkt?
-
deklariert hatte ich int* size;
Übrigens habe ich grade alles auf .c verändert und es stürzt immernoch ab...-.-
Die gesamte main ist:
#include <stdlib.h> #include <stdio.h> #include <math.h> #include "real.h" #include "fields.h" #include "blas.h" int main(){ int* size; REAL** A; A=createMatrix(10,10); REAL* x; x=createVector(10); REAL* y; y=createVector(10); int i,j; for(i=0;i<10;i++){ for(j=0;j<10;j++){ A[i][j]=(i+1)*(j+1); } } fill1Dfield(1,x,10); fill1Dfield(0,y,10); REAL* TEST_V; TEST_V=createVector(10); fill1Dfield(1,x,10); fill1Dfield(0,y,10); write1Dfield("bla.txt", x, 10); TEST_V=read1Dfield("bla.txt",size); printf("%i",*size); for(i=0;i<10;i++){ printf("%f", TEST_V[i]); } printMatrix(A,10,10); REAL* M; REAL* N; M=createVector(10); N=createVector(10); for(i=0;i<10;i++){ for(j=0;j<10;j++){ M[j]=A[i][j]; } N[i]=dot(M,x,10); } REAL a=nrm2(N,10); printf("%f",a); for(i=0;i<10;i++){ for(j=0;j<10;j++){ M[j]=A[i][j]; } y[i]=dot(M,x,10); } axpy(5,x,y,10); scal(1.5,x,10); REAL z=dot(x,y,10); printf("%f", z); return 0; }
-
Häää?
Es ist nur das hier, was das Program zum abstürzen bringt:
/for(i=0;i<10;i++){
printf("%f", TEST_V[i]);
}/
wieso ?! ohne den rest des Progs funzen diese drei zeilen an sich aber....
-
Also wenn die Ausgabe der gelesenen Werte korrekt ist, dann liegt es an nachfolgendem Code und du kannst froh sein, dass der eingefügte Code den nachfolgenden Fehler zu Tage fördert.
Du suchst den Fehler also an der falschen Stelle und lässt uns auch an der falschen Stelle suchen.
-
So sieht übrigens die Textdatei "bla" aus in die der das reinschreibt:
Im folgecode werden ja nur folgende funktionen benutzt:
...ok, die vierecke und das zeichen lässt sich hier iwie nicht reinkopieren...void axpy(REAL alpha, REAL* x, REAL* y, int len){ int i; for(i=0;i<len;i++){ y[i]=alpha*x[i] + y[i]; } } REAL dot(REAL* x, REAL* y, int len){ int i; REAL A[len]; REAL Summe=0; for(i=0;i<len;i++){ A[i]=x[i]*y[i]; } for(i=0;i<len;i++){ Summe+=A[i]; } return Summe; } REAL nrm2(REAL* x, int len){ REAL A=sqrt(dot(x,x,len)); return A; }
-
Slabic schrieb:
...ok, die vierecke und das zeichen lässt sich hier iwie nicht reinkopieren...
Hol dir einen Hexeditor und sieh nach, was wirklich hinter diesen Zeichen steckt. Dann kannst du uns schon mal sagen, ob wirklich das richtige in der Datei steht.
Deinen Code überblicke ich gerade nicht, aus Faulheit. Wie wär's mit einem gekürzten Beispiel, in dem das Problem noch besteht? Wäre sicher viel weniger Arbeit für uns.
-
ich habe jetzt statt wb.rb einfach nur w,r, benutzt, warum kann ich in der textdatei keine zahlen lesen?! sondern immernoch diese vierecke....?!
ð? ð? ð? ð? @ @ ð? ð? ð? ð?bei eclipse zeigte der mir halt vierecke zw. diesen zeichen da oben an.
also diese zeichen schreibt der mir in bla rein.
-
Nicht neue Fehler reinbringen, erstmal den einen abarbeiten.
Außerdem benutzt du für deine FILE Operationen keine Rückgabewerte, das ist immer schlecht nicht nur für die Fehleranalyse.
-
Slabic schrieb:
ich habe jetzt statt wb.rb einfach nur w,r, benutzt, warum kann ich in der textdatei keine zahlen lesen?! sondern immernoch diese vierecke....?!
Lieber "wb" und "rb", der Textmodus könnte noch zusätzliche Missverständnisse anrichten.
-
Ok, also die beiden folgenden Codes funktionieren alleine(d.h. wenn ich den jeweils anderen mit /**/ entferne), aber wenn ich beide in der main habe, kommt absturz "das programm funktioniern nicht mehr"
TEST_V=read1Dfield("bla.txt",size);
REAL* M; REAL* N; M=createVector(10); N=createVector(10); for(i=0;i<10;i++){ for(j=0;j<10;j++){ M[j]=A[i][j]; } N[i]=dot(M,x,10); }
Also für mich sieht das eher danach aus(angesichts der Tatsache, dass der mir in die Datei bla, diesen Mist reinschreibt:
ð? ð? ð? ð? @ @ ð? ð? ð? ð? )dass mein read1dfield oder eben ursprünglich write1Dfield nicht funktioniert...wie es sollte...
aalso was soll ich jetzt machen?! ^^
Ich ess jetzt erstmal was...
-
Guten Appetit.
Ist völlig normal, dass z.B. double so in einer Datei aussieht.
Zeige mal die REAL Deklaration und die createVector Implementierung.
-
Danke,
#ifndef REAL_H_ #define REAL_H_ #define REAL double #endif /* REAL_H_ */
REAL* create1Dfield(int size){ REAL *Array=(REAL *)calloc(size, sizeof(REAL)); return Array; } REAL* createVector(int len){ REAL* Vector; Vector=create1Dfield(len); return Vector;
-
Mach das REAL-Ding lieber mit typedef.
Hab ich das richtig verstanden, dass das Problem verschwindet, wenn du einen Teil auskommentierst, in dem nur Lesezugriffe auf den Speicher vorkommen? Das wäre nämlich merkwürdig, sowas kommt vielleicht von einem undefinierten Ausdruck.
-
Also diese Real-header ist auf diesem Übungsblatt so vorgegeben.
Und ja, wenn ich Test_V=read.... auskommentiere funktioniert das gesamte Programm.
Umgekehrt, wenn ich oben dieses andere Programmstück auskommentiere, funktioniert TestV=read und er gibt mir auch den richtigen vektor aus.....