nefertari001 Geschrieben 5. März 2007 Geschrieben 5. März 2007 Hallo ich hab einen 2 dim array angelegt, in diesem array sollen dateien abgelegt werden. jetzt bekomme ich eine Position übergeben und soll an diese Stelle im array springen und diese datei dann einlesen und anschließend damit noch weiterarbeiten. der befehl für das einlesen wäre ja ifstream myfile ("n38.min"); und dann mit seekg und tellg damit weiterarbeiten. aber wie mache ich das mit einem Array von Dateien. vielen dank Soni Zitieren
Klotzkopp Geschrieben 5. März 2007 Geschrieben 5. März 2007 aber wie mache ich das mit einem Array von Dateien.Was soll denn ein "Array von Dateien" sein? Dateien sind logische Objekte in einem Dateisystem, die kannst du nicht in ein Array stecken. Du kannst höchtens die Datennamen, Dateiinhalte oder Streamobjekte in Arrays ablegen. Also was genau ist in dem Array drin, bzw. was genau soll rein? Zitieren
nefertari001 Geschrieben 5. März 2007 Autor Geschrieben 5. März 2007 hi also jedes Feld der Matrix beinhaltet 2 .min Dateien. Diese muss ich auslesen und den darin enthaltenen Bytestream an einer bestimmten Stelle auslesen. gruß Zitieren
Klotzkopp Geschrieben 5. März 2007 Geschrieben 5. März 2007 also jedes Feld der Matrix beinhaltet 2 .min Dateien. Was meinst du mit "Dateien"? Wie sieht die Deklaration dieser Matrix aus? Zitieren
nefertari001 Geschrieben 6. März 2007 Autor Geschrieben 6. März 2007 hi also es sieht jetzt so aus. Ich lese eine Datei ein, mal egal woher. Diese Datei ist eine .min Datei und hat einen Header der in ASCI ist und einen data rumpf in hex. Ich hab jetzt versucht diese datei in einen String zu stecken da ich an eine ganz bestimmte stelle im Data Rumpf springen muss. mein code sieht mal so aus. ifstream file; string fileName = "n38.min"; file.open(fileName.c_str(), ios::in);//| ios::binary); // oeffen im Binaer-Modus if(file) { file.seekg(0, ios::end); // zum Ende Datei springen long fileSize = file.tellg(); // Dateigroesse auslesen file.seekg(0); // Zurueck zum Anfang springen //int pos = file.tellg(); char *text = new char[fileSize]; // Speicher fuer Text anlegen file.read(text, fileSize); // Text in 1 Rutsch auslesen file.close(); cout << text; delete text; // Speicher aufraeumen } else { cout << "Fehler!"; } cin.get(); return 0; jetzt zeigt es mit in der console nur den header an. wenn ich einen bestimmten bereich wähle zeigt er nur streifen. was kann ich machen um hier ein bestimmtes Byte auszulesen. hilfe!!! Zitieren
Guybrush Threepwood Geschrieben 6. März 2007 Geschrieben 6. März 2007 Du liest die gesamte Datei ein und gibst sie aus, was meinst du also damit das nur der Header ausgegeben würde? und vorallem was meinst du mit "Breich auswählen"? Da ist nirgendswo eine Auswahlmöglichkeit in deinem Programm. Zitieren
Klotzkopp Geschrieben 6. März 2007 Geschrieben 6. März 2007 jetzt zeigt es mit in der console nur den header an. wenn ich einen bestimmten bereich wähle zeigt er nur streifen.Beides liegt daran, dass du versuchst, Binärdaten als Text auszugeben. Da darfst du dich nicht wundern, wenn die Ausgabe seltsam aussieht. was kann ich machen um hier ein bestimmtes Byte auszulesen.Ausgelesen hast du doch schon. Du musst nur die gelesenen Daten richtig interpretieren. Zitieren
nefertari001 Geschrieben 7. März 2007 Autor Geschrieben 7. März 2007 Hi also ich hab es jetzt soweit, das ich an einer bestimmten Stelle ein Byte als Dezimalzahl auslesen kann. Mein Problem ist jetzt noch, dass ich 2 Byte brauche. Diese 2 Byte geben eine Höhe über grund an. Ich brauche also 2 aufeinander folgende Byte als Dezimalzahl ausgegeben. Jemand ein Idee. so sieht es bisher mit einem Byte auslesen aus. char hex = '0' ifstream myfile ("n26.min"); myfile.seekg(3500); if(myfile) myfile.get(hex); printf("%d", hex); cout << " "<< endl; myfile.close(); Gruß Sonja Zitieren
Klotzkopp Geschrieben 7. März 2007 Geschrieben 7. März 2007 Mach doch einfach das, was ich dir schon hier schon mehrfach geraten habe. Wenn du das nicht verstehst, dann frag doch nach. Angenommen, du brauchst einen vorzeichenlosen 16-Bit-Wert, und auf deinem System ist ein short 2 Byte groß: unsigned short value = 0; ifstream myfile ("n26.min"); myfile.seekg(3500); myfile.read( reinterpret_cast<char*>( &value ), sizeof( unsigned short ) ); cout << value; [/code] Jetzt kann es noch sein, dass du das auf einem Rechner mit Little-Endian-Architektur machst. Dann musst du noch die Bytereihenfolge vertauschen, weil der Wert laut Spezifikation Big-Endian ist: [code]value = ((value & 0xff) << 8) | ((value & 0xff00) >> 8); P.S.: cout und printf solltest du nicht mischen. P.P.S: Du solltest die Datei mit dem binary-Flag öffnen, sonst kann es zu merkwürdigen Effekten kommen, wenn Bytes mit dem Wert eines Zeilenumbruchs in den Daten auftauchen. Zitieren
nefertari001 Geschrieben 7. März 2007 Autor Geschrieben 7. März 2007 Danke es funktioniert so. Da wär ich aber im Leben nicht drauf gekommen und komplett verstehen tu ich´s au net. Wegen umdrehen war ich mir au erst sicher das ich das machen muss, aber da kommen keinen realen Werte raus deswegen fällt das umdrehen wohl doch weg. Gruß und danke nochmal Sonja Zitieren
Guybrush Threepwood Geschrieben 7. März 2007 Geschrieben 7. März 2007 Was hast du denn für ein System auf dem du arbeitest? Wenns ein normaler Intel PC ist dann solltest du auch Little Endian haben Byte-Reihenfolge - Wikipedia Wenn die Daten in der Datei jetzt wie Klotzkopp sagt Big Endian sind dann musst du die umdrehen. Sollte da dann nichts "vernünftiges" rauskommen hat das einen anderen Grund. Zitieren
nefertari001 Geschrieben 9. März 2007 Autor Geschrieben 9. März 2007 hi da ich wirklich keine kenntnisse in C++ habe tue ich mir momentan wahnsinnig schwer. Ich habe eine Methode die mir die benötigte Größe für ein Array berechnet. Jetzt möchte ich dieses Array so anlegen,dass ich es später mit bestimmten werten füllen kann. Hatte zuerst die größe als übergabe wert im constructor und hab dann dorkt im Konstruktor das array angelegt und erstmal mit aufeinanderfolgenden zahlen gefüllt. Da ich die Größe aber jetzt erst berechnen muss kann ich sie ja im constructor nicht mehr übergeben. Ich komm hier nicht klar da ich ein array ja nicht als rückgabewert bestimmen kann. Wie löse ich das am besten. wollte in der Klasse ein short testarray[] anlegen aber da will er immer eine größe haben und die kenn ich ja noch nicht. danke Sonja Zitieren
Guybrush Threepwood Geschrieben 9. März 2007 Geschrieben 9. März 2007 Entweder indem du das selber dynamisch anlegst (unter C mit malloc und free und unter C++ mit new und delete) oder indem du direkt einen passenden Container wie std::vector verwendest. PS: Du solltest aber der Übersicht wegen für jedes Thema einen neuen Thread anfangen Zitieren
nefertari001 Geschrieben 12. März 2007 Autor Geschrieben 12. März 2007 Hallo so weit so gut. Ich hab jetzt also mein Array und einen Ordner der alle Dateien enthält aus denen ich Daten auslesen muss. Wie kann ich ein Variable in meine Pfadangabe einfügen, so das ich immer den passenden Eintrag an die richtige Stelle im Array schreibe. so sieht es jetzt aus. ifstream myfile ("C:\\Dokumente und Einstellungen\\hagedornSo\\Eigene Dateien\\OPES15\\Hhendaten\\e85n26.min"); für e85 und n26 veränderbare Werte eingesetzt werden können, also brauche ich etwas in der art: ifstream myfile ("C:\\Dokumente und Einstellungen\\hagedornSo\\Eigene Dateien\\OPES15\\Hhendaten\\"+ variable+""+Variable2+".min"); weißt jemand wie das in C++ geht. Danke Sonja Zitieren
Klotzkopp Geschrieben 12. März 2007 Geschrieben 12. März 2007 Mit Stringstreams: ostringstream ss; ss << "C:\\Dokumente und Einstellungen\\hagedornSo\\Eigene Dateien\\OPES15\\Hhendaten\\" << variable << Variable2 << ".min"; ifstream myfile( ss.str().c_str() );[/code] Dafür brauchst du <sstream>. Zitieren
nefertari001 Geschrieben 12. März 2007 Autor Geschrieben 12. März 2007 hab´s probiert, er gibt mir aber nur eine null aus wenn ich versuche an eine bestimmte stelle in dem file zu springen. Das ist aber falsch also vermute ich mal es klappt leider nicht. unsigned short value = 0; ostringstream ss; int val1 = 85; int val2 = 26; ss << "C:\\Dokumente und Einstellungen\\hagedornSo\\Eigene Dateien\\OPES15\\Hhendaten\\e" << val1 << "n26.min"; ifstream myfile( ss.str().c_str() ); //ifstream myfile ("C:\\Dokumente und Einstellungen\\hagedornSo\\Eigene Dateien\\OPES15\\Hhendaten\\e85n26.min"); myfile.seekg(3437); myfile.read( reinterpret_cast<char*>( &value ), sizeof( unsigned short ) ); myfile.close(); yourArray[3] = value; cout << "test array " << yourArray[3] << endl; return yourArray; Zitieren
Klotzkopp Geschrieben 12. März 2007 Geschrieben 12. März 2007 Heißt es wirklich "Hhendaten", oder ist da ein ö verlorengegangen? Lass dir doch ss.str() mal mit cout ausgeben, und prüf, ob der Pfad wirklich stimmt. Zitieren
nefertari001 Geschrieben 12. März 2007 Autor Geschrieben 12. März 2007 hey super danke, ein typischer Copy/Paste Fehler :upps jetzt kann ich erstmal wieder ein bischen weitermachen, bis ich an die nächste Hürde stoße Danke Sonja Zitieren
nefertari001 Geschrieben 14. März 2007 Autor Geschrieben 14. März 2007 hey jetzt hatte ich das teil gerade am laufen. Mit Ifstream und so fort, da kommt mein Prof. und meint erhält nix von diesen neumodischen Sachen soll es mit Strings machen. Mein Problem hier ist. Im 1. Schleifendurchlauf füllt er brav meinen String sData und liest mir die richtigen Daten aus. Aber im 2. Durchlauf steht irgendwie nichts mehr meine Datei in sData. Vielleicht kann mir jemand helfen, der sich mit diesen String Dingern auskennt. int iCornerLat; int iCornerLong; int iLat = 0; int iLong = 0; int iPos = 0; unsigned short value = 0; ostringstream ss; ifstream myfile("000.txt"); FILE* fp = NULL; char* sData; sData = new char[50000]; char* sSub; sSub = new char[10]; short** iwert = new (short*); for(int c = 0; c < size; c++){ //Schleife durchluft Array for(int i = 0; i <= iLong; i++){ //Jedes 1x 1 Zelle der Gaming Area ablaufen, erst Breiten dann Lngengrade for(int j = 0; j <= iLat; j++){ if(fp != NULL) fclose(fp); ss << "C:\\Dokumente und Einstellungen\\hagedornSo\\Eigene Dateien\\OPES15\\Hhendaten\\e" << iCornerLong << "n" << iCornerLat <<".min"; fp = fopen( ss.str().c_str(), "r" ); if(fp){ for(int a = 0; a < iNumberRecord; a++){ for(int b = 0; b < iNumberElevation; b++){ int iByte = iConstStartData; iPos = iByte + (b * 2) + (a * iConstByteData); //Byteposition im File berechne fgets(sData, 40000, fp); *iwert = (short*)&sData[iPos]; //!!!!!!!hier steht wenn b = 1 nix mehr value = **iwert; value = ((value & 0xff) << 8) | ((value & 0xff00) >> 8); c = c++; } } } else { for(c; c < iValue; c++) { //wenn File nicht vorhanden 0 schreiben yourArray[c] = 0; } } iCornerLat = iCornerLat + 1; } iCornerLong = iCornerLong + 1; iCornerLat = iCornerLat - iLat; } } if(myfile) myfile.close(); sorry, dass den ganzen code reinstell wusste aber net wie ich´s ohne erklären soll. danke Sonja Zitieren
Klotzkopp Geschrieben 14. März 2007 Geschrieben 14. März 2007 Aber im 2. Durchlauf steht irgendwie nichts mehr meine Datei in sData. Vielleicht kann mir jemand helfen, der sich mit diesen String Dingern auskennt.Ich glaube, das hat mit Strings überhaupt nichts zu tun. Das Problem ist wahrscheinlich, dass du bei jedem Schleifendurchlauf die nächsten 40.000 Bytes aus der Datei liest. Ich vermute, einmal reicht. Zitieren
nefertari001 Geschrieben 14. März 2007 Autor Geschrieben 14. März 2007 Ja hab das Problem gelöst. Das nächste ist das wenn er das 2. mal in die j Schleife geht, dass er kein fp einliest obwohl die Datei existiert. Könnte das an dem fclose() liegen oder an dem oStringStream. Die if abfrage mit fclose habe ich schon mal auskommentiert das brachte aber nicht nichts. Hab mit stringstreams vorher noch nix gemacht, weiß daher nicht ob ich die in jedem Schleifendurchlauf neu schreiben darf. Gruß Sonja Zitieren
Klotzkopp Geschrieben 14. März 2007 Geschrieben 14. März 2007 Du könntest den Stringstream mit ss.str(""); zurücksetzen. Einfacher ist es aber wohl, wenn du den Stringstream erst in der Schleife anlegst, da wo du ihn auch benutzt. Die Methdoe, alle Variablen am Anfang zu deklarieren, ist ein Relikt aus C, das man in C++ nicht mehr braucht, und das auch nicht sonderlich sinnvoll ist. Zitieren
nefertari001 Geschrieben 20. März 2007 Autor Geschrieben 20. März 2007 iCount = 1; int i = 0; yourArray = new unsigned short [size]; unsigned short value = 0; ostringstream ss; ifstream myfile("000.txt"); FILE* fp = NULL; char* sData; sData = new char[size]; char* sSub; sSub = new char[10]; //short** iwert = new (short*); short** iwert = new short*; for(long c = 0; c < size; c++) { for(int i = 0; i <= iLong; i++) { for(int j = 0; j <= iLat; j++) { if(fp != NULL) { fclose(fp); } ostringstream ss; ss << "C:\\Dokumente und Einstellungen\\hagedornSo\\Eigene Dateien\\OPES15\\Hhendaten\\e" << iCornerLong << "n" << iCornerLat <<".min" << ends; fp = fopen( ss.str().c_str(), "r" ); if(fp != NULL) { fgets(sData, size, fp); for(int a = 0; a < iNumberRecord; a++) { for(int b = 0; b < iNumberElevation; b++) { int iByte = iConstStartData; iPos = iByte + (b * 2) + (a * iConstByteData); *iwert = (short*)&sData[iPos]; value = **iwert; value = ((value & 0xff) << 8) | ((value & 0xff00) >> 8); yourArray[c] = value; c = c++; } } } if(fp == NULL) { for(c; c < iValue; c++) { yourArray[c] = 0; } } iCornerLat = iCornerLat + 1; } iCornerLong = iCornerLong + 1; iCornerLat = iCornerLat - iLat-1; } } so leider gibt es immer noch Probleme. Es läuft alles optimal bis a =10. iPos = 5956, das ist korrekt und iwert sollte auf den richitigen Wert aus sData zeigen. Aber Value = 52685 und das gilt auch für alle nachfolgenden Durchläufe. c = 1200 an dieser Stelle. Eine Position davor ist alles noch korrekt. Ich weiß nicht was dieses 52685 sein soll und wo das herkommt. Einzige Idee die ich hatte ist,das ich vielleicht irgendwo drüberlauf aber das find ich nicht. In der Datei die ich einlese ist alles in Ordnung. Kein unterschied zu dem Schleifendurchlauf davor. Hoffe jemand hat eine Idee. Gruß Sonja Zitieren
Klotzkopp Geschrieben 20. März 2007 Geschrieben 20. März 2007 Ist das ein Kuddelmuddel. Ich würde das erst mal so weit wie möglich vereinfachen. Wenn iByte sowieso immer nur iConstStartData ist, brauchst du die Variable nicht. Die Zeile iPos = iByte + (b * 2) + (a * iConstByteData); wird dann zu iPos = iConstStartData + (b * 2) + (a * iConstByteData); und das wiederum zu iPos = (b * 2) + ( (a + 1) * iConstByteData); iWert brauchst du auch nicht. value = *( (short*)&sData[iPos] ); tut's auch. Und das hier c = c++; erzeugt undefiniertes Verhalten. Wenn du c einfach nur hochzählen willst, mach das so: ++c; Welchen Wert hat eigentlich iConstStartData? Zitieren
nefertari001 Geschrieben 20. März 2007 Autor Geschrieben 20. März 2007 constStartData ist 3436. Deswegen geht das mit (a +1) auch so net. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.