Abwechseln Werte aus Datei lesen
-
Dark_DanI schrieb:
Hoffe ihr versteht mein Problem und könnt mir helfen

hm...
nicht wirklich
Kannst vllt ein tolle beispiel bringen weil lese->erst Position, der nächste Wert dann Länge->nächste Zeile...
sagt mir wenig

mfg tobZel
-
Sorry, war wohl dumm beschrieben...
Also ein Beispiel:
Datei sieht so aus:
Postion Länge
Position Länge
...als Beispiel:
423 343
233 23
12 32
...Position und Länge sind zwei Integer...
Nun habe ich diese Datei vor mir liegen und lese sie ein.
Jetz will ich Position und Länge auch wieder richtig zugeordnet einlesen->
jeder zweite Wert ist Position und dazwischen die Längen...Im Moment hatte ich dieSache in ner for-Schleife regeln, wolln, nur das hat irgendwie nte so gefunzt, wies sollte...
for( int i = 0; i < ZeilenAnzahl; i++) { IN >> Position[i] >> Länge[i]; }Hoffe ihr versteht mich nun...
-
schön. sieht doch schon mal gar nich so übel aus.
aber was macht es für einen sinn, das als textdatei abzuspeichern?
machs doch direkt mit binären dateien und integern. Ist sauberer und schneller:/*angenommen, in deiner datei steht am anfang, wieviele datensätze einzulesen sind, danach folgen die integer-paare*/ ifstream inputStream ("myFile.mfl", ios::binary); size_t entryCount; //anzahl der integer-paare lesen inputStream.read( (char*) &entryCount, sizeof(entryCount) ); //dementsprechend genug speicher allozieren unsigned int* pPosition =new int[entryCount]; unsigned int* pLength =new int[entryCount]; //einlesen for(size_t i=0; i<entryCount; i++){ inputStream.read( (char*) &pPosition[i], sizeof(unsigned int) ); inputStream.read( (char*) &pLength[i], sizeof(unsigned int) ); }so ist es imho einfacher, definitiv schneller, und man spart dadurch im durchscnitt 2/3 der dateigröße ein...

-
danke für den Tipp->
Bin gerade auf ini-Dateien gestoßen und hab mich auch schon ein wenig dran ergooglet. Scheinen für meine Situation auch die beste Lösung zu sein.WritePrivateProfileString(...);
Kommt bei mir leider der Fehler: Bezeichner wurde nicht gefunden
Benötigt man dazu ne bestimmte Header-Datei->windows.h?
Bin das SDK grad erst am runterladen, darum...
-
ini dateien sind afaik auch wieder so eine art von formatierten text-dateien. Wozu brauchst du denn diesen text? Hast du vor, es manuell abzuändern? Und bei ini-dateien ist das verhältnis von information/volumen noch schlechter, als bei deinem bisherigen vorschlag, und die sind imho auch sehr viel schwieriger auszulesen (da braucht mal ja nen parser für!)
-
ich kenn mich mit inis nicht besonders aus, aber erklär mir, was nicht gehn sollte?
for-Schleife
{
ini-Objekt-Schreiben
}for-Schleife
{
ini-Objekt-Einlesen
}Mit nem int-Array wäre das ganze doch ganz simple, oder vergess ich hier was?
-
.INI != simpel 
verglichen zu stinknormalen binären dateien zumindest... Denn etwas einfacheres, schnelleres und sichereres als gewöhnliche binäre dateien gibt es schlicht und einfach nicht.
INI dagegen sind so konzipiert, dass sie von einem menschen manuell editiert werden können. Es gibt selbstverständlich fälle, in den es ganz sinnvoll und nützlich ist. Wenn man beispielsweise eigenschaften einer sehr komplexen struktur mit 50 verschiedenen datentypen manuell festlegen will, wie zum beispiel attribute einer einheit in einem strategiespiel... Die sind für den menschen schön zu lesen, allerdings ist es vollkommen irrsinnig, solche dateien zum speichern von einfachen integer-arrays zu missbrauchen, weil:-
das alles sehr lahm wird. Bei INI's muss nähmlich der variablenname geparst, gesucht, anschliessend dazugehörige wert gefunden, wieder geparst und letztendlich in die normale binäre darstellung übersetzt werden. Wenn dein array auch noch länger wird, dann dauert die suche eine halbe ewigkeit
-
Die benötigte dateigröße wächst um das ~vierfache bzw im extremfall um das sechzigfache an, wenn man es ungeschickt macht (ist eine textdatei eben...)
-
dein programmcode wird sehr viel komplizierter und unverständlicher. Wie willst du denn das in die ini's speichern, also unter welchen "namen"? willst du die namen für jede einzelne variable in einem string array speichern oder wie? wenn du das machst, verschwendest du auch noch unmengen von speicherplatz auf dem heap. Und zwar nur für einen zweck: damit die daten möglichst langsam geladen werden^^
=> ini dateien sind für simple integer arrays absoluter overkill.
machs doch kurz und einfach... binär: 1010101001010111011010101010010010100100101001001010100010001001010110101011011011011010010010011 
-
-
Du kannst einfach über alles einen index machen und dann loopen
-
worauf bezog sich ebn diese aussage? bei prozeduralen programmiersprachen kann man so ziemlich alles loopen^^

-
hast ja recht, binär scheint die beste LKösung zu sein, erklärst du noch schnell, wie ich die Zahlen binär ausgebe/einlese?
Deinen Beispiel-Code check ich jetz net so ganz
Ach ja, dann hätte ich doch im Prinzip wieder das selbe Problem wie am Anfang, oder?
Hab jetz als Beispiel die Datei:
10010101 100101010 100101001 ...
Ich muss ja nur jede Zweite Zahl einlesen, aber WIE?
Und umrechnen von Dezimal nach Binär funzt bei mir irgendwie net
-
also.
Das geilste an den binären zahlen ist ja, dass du gar nichts umrechnen musst.
Der rechner versteht im grunde nur binäre zahlen, er rechnet immer mit binären zahlen und speichert alles in binärer form. Deswegen ist es auch so schnell.Nur zur ausgabe auf dem bildschirm für die menschen werden die zahlen zu guter letzt wieder in dezimales system umgerechnet, ansonsten werden die dezimalen zahlen nirgendwo gebraucht. (gut, bei der eingabe eben dasselbe: dezimal von dem menschen nehmen, sofort in binär umrechnen, und erst dann mit der eigentlichen verarbeitung beginnen)
Okay, jetzt zu dem was ich da geschrieben habe. Wenn es ums schreiben bzw lesen von binären dateien geht, ist folgende lösung imho die praktischste und am häufigsten angewandte:
#include <iostream> #include <fstream> using namespace std; int main(){ //hier wird eine datei zum schreiben geöffnet ofstream myOutput("myFileName.wtf", ios::binary); //hier erstellst du dir irgendwelche zahlen, //die du in die datei schreiben willst int lengthArray[]={123,234,345,456,567}; int positionArray[]={1,2,3,4,5}; //in einer schleife schreiben: for(size_t i=0; i<5; i++){ myOutput.write( (char*)(&lengthArray[i]), //zeiger: wo liegt das objekt? sizeof(int) ); //wie groß ist es? //genau dasselbe für die position: myOutput.write( (char*)(&positionArray[i]), sizeof(int)); } myOutput.close(); //jetzt sind die zahlen abwechselnd in die datei geschrieben worden //so kann man die wieder auslesen: ifstream myInput("myFileName.wtf", ios::binary); int pos=0, len=0; for(size_t j=0; j<5; j++){ myInput.read( (char*)(&len), sizeof(int) ); myInput.read( (char*)(&pos), sizeof(int) ); cout<<"Position/Length: "<<pos<<" | "<<len<<endl; } myInput.close(); return 0; }Das sollte für'n anfang reichen, wenn was unklar ist, sind im code auf jeden fall genug stichwörter zu finden (doku, forumsuche, google werden bestimmt weiterhelfen) ansonsten nochmal nachfragen

-
wenn du nur jede zweite zahl einlesen musst, liest du einfach alle nacheinander ein, verwendest aber nur jede zweite...
-
danke, werd mal sehn, wies sich in der Praxis macht und dann bescheit geben

Also im Moment bekomme ich solche und ähnliche Ausgaben in der Datei zu sehn:
( @ h ....und wenn ich sie wieder einlese sind alle Werte 0...
kann aber eigentlich nicht stimmen.
-
Also im Moment bekomme ich solche und ähnliche Ausgaben in der Datei zu sehn:
( @ h ....wie "sehen" ? hast du es mit nem text-editor geöffnet oder wie?
dann ist es auch kein wunder... deine integer werden dann jeweils in vier ein-byte-stücke gehaun und jeweils als vier buchstaben bzw. irgendwelche symbole interpretiert...
das ist ja auch nicht der sinn der sache. Diese daten sind ja nicht für einen leser, sondern für den rechner gedacht.
Um die werte wieder richtig darstellen zu können, musst du es mit einem eigenen programm genauso auslesen, wie du sie reingeschrieben hast.und wenn ich sie wieder einlese sind alle Werte 0...
kann aber eigentlich nicht stimmen.also, mein beispiel habe ich eigentlich getestet, hat bei mir auch sehr schön geklappt... so wie es sollte...

-
mim Editor war mir auch klar, dass ich nix schönes zu sehn bekomme, aber selbst wenn das Programm die Werte interpretiert bekomme ich für jeden Wert 0 geschickt->ich teste weiter...
-
moment mal... ich bin mir zu 95% sicher, dass mein codebeispiel funktioniert... poste doch einfach mal hierrein das, was du geschrieben hast, vielleicht fällt der fehler direkt auf...
-
ok:
for( int i = 0; i < Anzahl_der_Paare; i++) { TEST1.write((char*)(&iPos[i], sizeof(int)); TEST1.write((char*)(&iLen[i], sizeof(int)); } for( int i = 0; i < Anzahl_der_Paare; i++) { TEST1.read((char*)(&iPos[i], sizeof(int)); TEST1.read((char*)(&iLen[i], sizeof(int)); }Was is da falsch?
EDIT:
An dem ifstream TEST1("Test.xxx", ifstream::binary); liegts nicht, oder?
-
also wenn du mit einem input-file-stream versuchst irgendetwas zu schreiben, dann kann da ja wohl nichts gutes rauskommen...
-
nein nein, dass war nicht der Sinn der Frage->natürlich benutze ich zum Schreiben ofstream...
Ich wollte nur wissen, obs nen Unterschied macht, ob ich ios::binary schreibe, oder ifstream::binary/ofstream::binary schreibe
-
hm, wenn ich das wüsste... kP... mit ios::binary hats bisher immer ganz jut geklappt, was das andere heisst, musst ich wieder in der doku nachschauen...