kein plan mehr - datei bearbeiten....

mk-comp

Grünschnabel
Hi Leute.

Ich hab mal vor ein paar jahren c++ gehabt in der schule. Heute bereue ich es nicht besser aufgepasst zu haben!

also es ist so:

ich müsste eine Datei einlesen und bearbeiten: und zwar immer vom schema aufgebaut wie diese http://windundregen.dyndns.biz/0604.dat

Da sich das ja wiederholt, würde ich die ersten 19 Zeilen in ner Schleife laufen lassen.

ab der fünften Zeile bis zur 19. müsste nur die 3 Spalte geändert werden.

Im Theoretischen wüsste ich schon noch wie es geht, aber praktisch haben mich die c++ zellen schon fast ganz verlassen. In meine Scripten find ich auch nix mehr.

Hätte ich nen Lösungsansatz würd ich evtl schon weiter kommen....

ich weiß nur nicht, ob ich strings oder arrays einlesen soll usw usw.

Eure Hilfe wird mir bestimmt weiterhelfen.

Ein grosser Dank schon mal im Vorraus.
 
Willkommen auf tutorials.de!

Also ich denke ich würde die Datei zeilenweise abarbeiten, in C++:
C++:
#include <iostream>
#include <string>
#include <fstream>

using namespace std;
...
string line;
ifstream datei("xyz.dat");
while (getline(datei, line)) {
  ...
}
Dann kannst du ja feststellen ob die Zeile eine Kopfzeile oder eine Datenzeile der Tabelle ist (z.B. durch mitzählen der Zeilennummer).

Dann könntest du z.B. die Zeile mit Hilfe einer Funktion in einen std::vector splitten (nach "split" hier im Forum suchen) und dann kannst du da auch die 3te Spalte ändern.

Gruß
 
yo danke,cool.

das probier ich mal.

hab da bestimmt noch mehr fragen...

z.b: wie kann ich denn die zeilen mitzählen lassen
Code:
#include<string>
#include<fstream>
#include<iostream>
using namespace std;

int main()
{
   ifstream ein("0604.DAT");
   if (!ein.is_open()) return 0;
   string line;

// hier müsste doch dann schon kommen, dass er die Zeilen zählt, oder?

   while (getline(ein,line))
   {  

//Jetzt müsste er doch eigentlich alles einlesen?
//und hier sag ich ihm, dass die 3 spalte z.b um 20 erhöht werden muss, oder?
//aber wie deklarier ich dass er weiss was die 3.spalte ist
   
   
   }
      ofstream aus("0604mod.dat");
   return 0;
}


hier ist ein alter lösungsansatz, der die datei einliest und auch die spalte ändert, aber er gibt die datei nicht genauso wieder sondern anders....

Code:
#include <string>
#include <fstream>
using namespace std;    

int main()
{
   int type;
   const int spalte = 3;
   string H_Elster("H_Elster");
      string SNRW("SNRW");
   string stri;
  
   ifstream ein("0604.DAT");
   if (!ein.is_open()) return 0;
   ofstream aus("x0604x.dat");
  
   while (!ein.eof()) 
   {
      for (int i = 1; i < 21; i++) 
	  {
         if (i == spalte) 
		 {
            ein >> type;
			
			type += 3; //<-----

			if (type>=360)
			{
				int zahl;
				zahl=360;
				type = type-zahl;
			}

			if (type>=9000)
			{
				int zahl1;
				zahl1=9999;
				type = zahl1;
			}
			
			aus.width(3);
            aus << right << type << " ";
         }
         else 
		 {
            ein >> stri;
            if (ein.eof()) break;
            if (stri == H_Elster) 
			{
               aus.width(3);
               aus << endl << right << stri << " ";
               do 
			   {
                  ein >> stri;
                  aus << stri << " ";
               }while (stri != SNRW);
               //aus  << endl;
               break;
            }
            aus.width(6);
            aus  << stri;
         }
      }
      aus << left << endl ;
   }
   return 0;
}

oh, mann , ich brauch nen c++ Kurs dringend.....

Bin am Verzweifeln.....
 
Zu allererst mal: die Konstruktion mit while(!stream.eof()) solltest du nicht gebrauchen - das funktioniert nicht (zuverlässig).

Um die Zeilen zu zählen mußt du vor der Schleife natürlich eine Variable dafür vereinbaren und in der Schleife mußt du diese dann inkrementieren.

Wenn du das Format mit den Leerzeichen beibehalten willst wird das ändern einer Spalte natürlich etwas schwieriger. Die Zeile kannst du aber natürlich zeichenweise durchgehen und nach dem Anfang und dem Ende des 3. Wertes suchen und den extrahieren. Dann in einen Integer konvertieren und entsprechend verändern. Den Wert mußt du dann zurück in einen String konvertieren und schauen ob er länger oder kürzer geworden ist als der ursprüngliche Wert und ihn entsprechend an eine Stelle einfügen.

Gruß
 
ich werd morgen vormittag nochmal dran arbeiten. hatte heute keine zeit mehr.

Kann ich den quellcode dann posten und du schaustihn dir mal an?

wäre nett...
 
Zurück