Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » einlesen - verändern- ausgeben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
29.05.2006, 14:06 Uhr
~urkman
Gast


Hi.
Ich hab schon lange nix mehr in c++ gemacht. darum stell ich mich auch ein bischen, glaub ich....

Es geht um folgendes:

Ich möcht eine Datei http://windundregen.dyndns.biz/060413dv.dat einlesen und dort immer nach den ersten vier Zeilen die 3.Spalte verändern in der ganzen Datei.
z.B: die ganze Spalte plus 20 meinetwegen.

Nachdem das verändert ist, sollte es möglichst mit dem selben Dateinamen wieder abgespeichert werden. wobei das nicht zwingend ist...

Es geht hier um Winddaten und es kann vorkommen, das die Technik den Winkel falsch eingibt. Dann müssen wir manuell alle Spalten ändern. Jetzt will ich da ein kleines Progrämmle schreiben, dass die Arbeit vereinfacht wird.....

Hab gestern mal wieder nen Taschenrechner programmiert um wieder reinzukommen.....

Danke euch im Vorraus für Hilfen Ratschläge usw...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.05.2006, 14:55 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Das klingt für mich eher nach AWK oder Perl als nach C++... wenns unbedingt C++ sein muss, lies die Datei zeilenweise ein, prüf jede Zeile, ob sie Daten oder Überschriften enthält, und splitte Datenzeilen in ihre Komponenten auf (z.B. vector<string>). Dann den dritten Wert in eine Zahl konvertieren, 20 dazu, wieder nach String. Dann die Zeile wieder ausgeben.


Bearbeitung:
Jaja, die Smileys...

--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.

Dieser Post wurde am 29.05.2006 um 14:56 Uhr von Bruder Leif editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.05.2006, 15:26 Uhr
~urkman
Gast


tach.
ja leider. es sollte c sein. von perl und awk hab ich keine ahnung....von c nicht mehr viel...

das mit den vektoren hatten wir mal vor langer zeit in der schule..

ich könnt das in ne schleife packen und immer die ersten 4 zeilen raussschmeißen und dann die zeilen 5-19 splitten.

wenn du mir den code für die ersten 4 zum ruascheissen schnell tippen könntest und mir schreibst, wie ich das mit den vektoren mach, würd ichs hinbringen..
wenns nichts ausmacht.

mfg und thx
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.05.2006, 06:56 Uhr
Helmut



Hi!
Habs Dir nicht als Template-Funktion geschrieben. Vor type kannste auch double eintragen,
wenns halt ne andere Spalte sein soll. Die vier Zeilen! hab ich jeweils in eine Zeile geschrieben,
hatte keine Lust zum Basteln!

C++:
#include "stdafx.h"// VS2005
#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("c:\\060413dv.dat");
   if (!ein.is_open()) return 0;
   ofstream aus("c:\\X060413dv.dat");
  
   while (!ein.eof()) {
      for (int i = 1; i < 21; i++) {
         if (i == spalte) {
            ein >> type;
            type += 20; //<-----
            aus.width(7);
            aus << right << type << " ";
         }
         else {
            ein >> stri;
            if (ein.eof()) break;
            if (stri == H_Elster) {
               aus.width(12);
               aus << endl << right << stri << " ";
               do {
                  ein >> stri;
                  aus << stri << " ";
               }while (stri != SNRW);
               aus  << endl;
               break;
            }
            aus.width(7);
            aus << right << stri;
         }
      }
      aus  << endl ;
   }
   return 0;
}




PS Das die Dateien verschiedene Namen haben, ist hier zwingend.

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.05.2006, 10:07 Uhr
~urkman
Gast


total cool. danke.

bei den vier zeilen muss ich praktisch jeweils den zeilenanfang und das zeilen ende in nen string wandeln und dann
das

string H_Elster("H_Elster");
string SNRW("SNRW");
string stri;

modifizieren?

ich probiers mal und poste es, falls es nicht geht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.05.2006, 10:09 Uhr
urkman



Hab mich jetzt mal registriert...

falls noch weiter Fragen von mir kommen....

MfG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
31.05.2006, 11:44 Uhr
urkman



Hi.
ich bin wieder soweit wie am anfang.

Das Programm von Dir Helmut setzt alles um, aber die .dat files werden mit fortran bearbeitet und müssen genauso gespeichert werden, wie ursprünglich.
Ich hab das mit den vier Zeilen probiert, aber es funzt ned.
Das der Dateiname nicht gleich ist, stört nicht. fortran liest nur die ersten 6 zeichen aus. also kann ich die ja z.b: 060406mod.dat nennen.

wenn man die neunzehn zeilen einliest in der whileschleife, kann man doch ab ab der 5. Zeile die 3.Spalte auslesen und diese dann mit dem richtigen Winkel addieren, oder nicht?

Oh mann, ich glaub ich muss noch irgendwann mal nen auffrischungskursus machen.....hihi.

Wirklich, Vielen Dank für euere Hilfe!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
31.05.2006, 18:06 Uhr
Helmut



Hi!
Habs für dich geändert.

C++:
#include <string>
#include <fstream>
using namespace std;    

int main()
{
   const int spalte = 3;
   const int sb[21] =  { 0,4,7,5,7,7,5,7,5,7,7,5,5,5,7,7,5,5,5,5,5 };
   const int korrektur[19] = {0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1};
   int type, zeile;//z.B.Korrigiert werden die 5, 6 , 7 und 19. Zeile
   string stri;    //in allen Blöcken!
   char buf[256];

   ifstream ein("c:\\060413dv.dat");
   if (!ein.is_open()) return 0;
   ofstream aus("c:\\X060413dv.dat");
  
   while (!ein.eof()) {
      for (int i = 1; i < 21; i++) {
         if (i == spalte && korrektur[zeile++]) {
            ein >> type;
            type += 20; //<-----
            aus.width(sb[i]);
            aus << right << type;
         }            
         else {
            ein >> stri;
            if (ein.eof()) break;
            if (stri == "H_Elster") {
               aus << stri << " ";
               for (i = 0; i < 4; i++) {
                  ein.getline(buf, 256);
                  stri = buf;
                  if (i != 3)
                     aus << stri << endl;
                  else
                     aus << stri;
               }
               zeile = 4;
               break;
            }
            aus.width(sb[i]);
            aus << right << stri;
         }
      }
      aus  << endl ;
   }
   return 0;
}




Ist richtiger Kult der Seewetterbericht, höhr ich täglich:
"Deutsche Bucht Nord-West 7 Böhen 8"
dass einzig Gute an den Nachrichten.
mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.06.2006, 08:30 Uhr
urkman



Guten Morgen,

das ist ja toll. Es funzt wie am Schnürchen gezogen. ich werd es gleich mal an verschiedenen dats testen.

Ein megagroßes THX an Dich, Helmut!!

Dieser Post wurde am 01.06.2006 um 08:30 Uhr von urkman editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
06.06.2006, 09:47 Uhr
urkman



Hi.

da das programm von nem kollegen bedient wird , würd ich da gern noch ne eingabemaske basteln.
Hab da schon was gepostet, komm aber nicht weiter.


Code:
string datein;
   string dataus;
   cout<<"Bitte den einzulesenden Dateinamen eingeben:";
   getline (cin, datein);
   cout<<endl<<"Wie soll die AusgabeDatei heissen: ";
   getline (cin, dataus);
   ifstream ein("datein");
   ofstream aus("dataus");


prinzipiell müsste doch das so passen?

er fragt brav und ich kanns eingeben, aber schreiben tut er mir die datei nicht...

an was könnte denn das liegen?

MfG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: