byteweise schreiben.
-
Vodn7V schrieb:
ja nach den headern habe ich schon geguckt, nach gegoogled und in der msdn nachgeschaut. und nur immer das hier gefunden " (in mscorlib.dll)"
in machnen quellcodes stand es auch so : #using mscorlib.dll;
das habe ich auch probiert. ging aber nicht. gibt es denn noch einen anderen weg ?
Eine DLL ist kein Header

ja das sagt er auch in der fehlermeldung. aber ich habe keine konvertierungsmöglichkeit gefunden bis jetzt .
struct TCORRECTIONTABLE *' kann nicht in 'char *' konvertiert werden Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder FunktionsformatDa steht doch sogar dabei, was du benötigst:
byteptr=reinterpret_cast<char*>&CorrectionTable;
-
sorry ich bin noch nichts so der fuchs was das angeht. bin erst seit januar im geschäft

byteptr=reinterpret_cast<char*>&CorrectionTable;also das einfach hinschreiben ?
error C2059: Syntaxfehler : '&' error C2143: Syntaxfehler : Fehlendes '(' vor '&'die fehlermeldungen hab ich da bekommen.
das mit dem reinterpret cast habe ich oft gehabt immer konvertierungsprobleme. geht das denn so einfach ?
wenn zb double gefragt ist :
bla = reinterpret_cast<double> &CorrectionTable;
? habe ich das richtig verstanden ?
nur fuer die zukunft
oder voll auf dem holzweg 
EDIT: k sorry lag an den klammern. aber so algemein wie ich mir das dachte is das richtig so `?
-
Hi!
ptr = reinterpret_cast< dst *>( &xyz ); //also byteptr = reinterpret_cast< char *>( &CorrectionTable );Du brauchst natürlich Klammern. Im Übrigen kannst du nicht wahrlos zwischen Datentypen herumcasten. Ganz davon abgesehen das man Casts sowiso immer vermeiden sollte, musst du dir schon ein wenig Gedanken darüber machen was du castest und ob es Sinn macht.
grüße
-
also so recht will das nicht

TCORRECTIONTABLE CorrectionTable; char *byteptr; int i; FILE *datei; datei = fopen(FileName_end,"a"); fseek(datei, 0L,SEEK_SET); byteptr = reinterpret_cast <char*> (&CorrectionTable); for(i = 0; i < MEMDUMPSIZE-1 ; i++) { fwrite(&byteptr,sizeof(CorrectionTable),1,datei); } fclose(datei); return 0;so sieht es jetzt aus. wenn ich das aber laufen lasse dann wird die textdatei endlos groß---- ist dann schnell mal bei über 500mb .
hier nochmal das füllen :
char one_two_seven[16]; strcpy (one_two_seven,"127"); char null[16]; strcpy (null,"0"); TCORRECTIONTABLE CorrectionTable; for(int j = 0; j < 1023; j++) { for(int x = 0; x < 15; x++) { CorrectionTable.FacetNum[x].CorrPoint[j].DDS_REG_VAL = FDD_scenter; CorrectionTable.FacetNum[x].CorrPoint[j].Intens = one_two_seven[x]; CorrectionTable.FacetNum[x].CorrPoint[j].CrossScan = one_two_seven[x]; CorrectionTable.FacetNum[x].CorrPoint[j].Facet_Offset = null[x]; CorrectionTable.FacetNum[x].CorrPoint[j].Not_Used = null[x]; } } return 0; }
-
Dein fwrite()-Aufruf schreibt bereits die komplette Struktur in die Datei - da brauchst du keine for()-Schleife drumherum.
-
es passt irgendwie nicht so richtig.
so sieht es im moment aus :
double WriteCorrDataToFile(CString FileName_end) { TCORRECTIONTABLE CorrectionTable; char byteptr; // int i; FILE *datei; datei = fopen(FileName_end,"a"); fseek(datei, 0L,SEEK_SET); byteptr = reinterpret_cast <char> (&CorrectionTable); //for(i = 0; i < MEMDUMPSIZE-1 ; i++) //{ //fprintf(datei,"%d",CorrectionTable); fwrite(&byteptr,sizeof(CorrectionTable),1,datei); //} fclose(datei); return 0; } double WriteDataToStruct(unsigned int FDD_scenter) { TCORRECTIONTABLE CorrectionTable; for(int j = 0; j < 1023; j++) { for(int x = 0; x < 15; x++) { CorrectionTable.FacetNum[x].CorrPoint[j].DDS_REG_VAL = FDD_scenter; CorrectionTable.FacetNum[x].CorrPoint[j].Intens = 0x7F; CorrectionTable.FacetNum[x].CorrPoint[j].CrossScan = 0x7F; CorrectionTable.FacetNum[x].CorrPoint[j].Facet_Offset = 0x00; CorrectionTable.FacetNum[x].CorrPoint[j].Not_Used = 0x00; } } return 0; }jedoch schreib er falsch in die datei. was kann das sein ?
wenn ich mit dem debugger durchgehe kann ich sehen das er die center frequenz, die 127 und die 0 (als hex dargestellt) ohne probleme in daas struct geschrieben werden.
aber er schreibt es irgendwie falsch in die datei !!?
hast du noch nen tipp ?
danke dir
EDIT: also ich gehe davon aus das es am schreiben liegt, weil wie schon gesagt , wenn ich mit dem debugger beim "in den struct schreiben " durchgehe dann befinden sich die daten im struct.
wenn ich mit einem programm die datei dann aber auslese gibt er mir den reingeschriebenen wert der auf 127 stehen sollte immer auch 210 aus. egal ob ich in hex zahlen 1 oder 500 angebe. immer 210. deswegen gehe ich davon aus das er flasch schreibt.
bin gespannt auf deine antwort.danke schonmal.
-
*schieb*
hat jemand noch ne tipp ? was gibt es noch fuer befehle in denen ich byteweise in eine datei schreiben kann ?
dankeEDIT: das problem liegt irgendwo im struct. die daten werden ins struct geschrieben jedoch sobald die funktion zum schreiben der datei aufgereufen wird ist das struct leer

-
Du hast einen char dekalriert und packst in den das erste Byte der Adresse deiner Tabelle - anschließend schreibst du diesen char und die nächsten x Bytes in deine Datei (was dort steht, gehört dir nicht einmal), also brauchst du dich nicht wundern, wenn du nur Müll bekommst. Richtig wäre es, wenn du einen char* verwendest:
void WriteToFile(string name,const TCORRECTIONTABLE& data) { char* byteptr=reinterpret_cast<char*>(&data); ofstream file(name.c_str(),ios::out|ios::binary); file.write(byteptr,sizeof(data)); }PS: Ein zweiter Fehler - du hast deine Tabellen lokal definiert, also werden sie am Ende jeder Funktion gelöscht.
PPS: In C++ solltest du besser fstreams verwenden anstelle von C FILE-Pointern

-
aber jetzt nochmal vorab. zu meinem EDIT: ist das denn nicht komisch das wenn ich tcorrectiontable aufrufe da nichts mehr drinsteht ? also ich bin mit dem debugger durchgegangen in der funktion in der er das in das struct schreibt. kein problem kann die daten einsehen die er reingeschrieben hat. wenn ich aber in der funktion nen brekpoint setze in der die datei geschrieben is und nachgucke was in tcorrectiontable drinsteht. dann steht nur der erste wert der mit unsigned int deklariert ist im struct. die anderen char elemente sind leer. bzw es steht "52 I " da drin.
EDIT: k werde das mal verseuchen. die anders zu definieren,
EDIT 2:
wie mache ich das denn ? und wieso steht 1 wert immer noch drin nur die char werte werden gelöscht ?habe es so gemacht
WriteDataToStruct (FDD_scenter[z],CorrectionTable); WriteCorrDataToFile(FileName_end,CorrectionTable); }double WriteDataToStruct(unsigned int FDD_scenter,TCORRECTIONTABLE CorrectionTable ) { ;wenn ich da nen const hinmache sagt der mir nur errors weil der L_Wert konstant ist.
-
Vodn7V schrieb:
ist das denn nicht komisch das wenn ich tcorrectiontable aufrufe da nichts mehr drinsteht ?
Nicht wirklich - du hast zwei Tables angelegt (in jeder Funktion eine eigene) und die werden jeweils am Ende der Funktion wieder aufgeräumt. Du solltest stattdessen in der Hauptfunktion eine Tabelle anlegen und diese an die Hilfsfuntkionen übergeben:
void WriteToFile(const string& name,const TCORRECTIONTABLE& data) { //siehe oben } void FillStruct(TCORRECTIONTABLE& data) { for(int j = 0; j < 1023; j++) { for(int x = 0; x < 15; x++) { data.FacetNum[x].CorrPoint[j].DDS_REG_VAL = FDD_scenter; data.FacetNum[x].CorrPoint[j].Intens = 0x7F; data.FacetNum[x].CorrPoint[j].CrossScan = 0x7F; data.FacetNum[x].CorrPoint[j].Facet_Offset = 0x00; data.FacetNum[x].CorrPoint[j].Not_Used = 0x00; } } } int main() { TCORRECTIONTABLE CorrectionTable; FillStruct(CorrectionTable); ... WriteToFile("table.dat",CorrectionTable); }(Edit: Und damit die Daten ans Hauptprogramm zurückgehen können, mußt du die Tabelle als Referenz übergeben (das ist das unscheinbare & vor dem Namen ;)))
-
k das versteh ich danke. habe soweit alles umgeschrieben. jetzt jedoch die meldung :
error C2440: 'reinterpret_cast' : 'const struct TCORRECTIONTABLE *' kann nicht in 'char *' konvertiert werdenwas hab ich jetzt schon wieder falsch gemacht ?
EDIT: aber sehr geil mit der übergabe der daten das klappt jetzt schonmal

EDIT2: habe das const einfach weggemacht. jetz tgeht es

*knuuuuuuuuuuuuuuuuuuutsch*
DANKE DIR !!!!!
-
so das gute Forum !
ihr habt echt nen dickes Lob verdient. auch wenn es nicht immer einfach mit mir oder den anderen die noch nichts so vie ahnung davon haben ist, wird einem trotzdem immer bestens geholfen.
PERFEKT !!
EDIT: ihr könnt ja bald schon lehrgeld nehmen
habe schon sehr viel bei euch gelernt !
-
hätte da doch noch mal nme frage

konnte nirgends was finden. weder bei google noch hier . also ich schreiben ja so in die datei :
char* byteptr = reinterpret_cast<char*>(& data); ofstream file(FileName_end,ios::out|ios::binary); file.write(byteptr,sizeof(data));meine frage:
ich habe jetzt einen pfad den ich mit dem filedialog auslese. wie füge ich den in die fwrite funktion ein, so dass er auch in den pfad schreibt ??
danke
-
Vodn7V schrieb:
ich habe jetzt einen pfad den ich mit dem filedialog auslese. wie füge ich den in die fwrite funktion ein, so dass er auch in den pfad schreibt ??
Gar nicht - fwrite() bzw. fstream::write() erwartet, daß du vorher die richtige Datei geöffnet hast. (und das machst du, indem du den Dateinamen an den ofstream-Konstruktor übergibst)
-
ich öffne doch vorher gar keine datei oder ? ich erstelle doch jedes mal eine neue mit fwrite. dem knstrukot übergeb ich meinen dateinamen ja, aber ist es nicht möglich den pfad mit zu übergeben ?
-
Vodn7V schrieb:
ich öffne doch vorher gar keine datei oder ?
Doch - das erledigt der Konstruktor "ofstream file(FileName_end,ios::out|ios::binary);" freundlicherweise für dich

ich erstelle doch jedes mal eine neue mit fwrite.
Nein fwrite() erzeugt keine Datei - es füllt nur eine bereits geöffnete Datei (fopen()) mit Daten.
(PS: Wie gesagt, in C++ solltest du statt der f...()-Funktionen lieber fstreams verwenden)
dem knstrukot übergeb ich meinen dateinamen ja, aber ist es nicht möglich den pfad mit zu übergeben ?
Dem Konstruktor kannst du alles übergeben, was nach Dateiname aussieht - auch einen kompletten Pfad zur Datei.
-
pefekt. es geht. besten dank !!