Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Zeilen löschen

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
08.09.2005, 11:02 Uhr
~Realmastermerlin
Gast


Hallo. Hab folgendes Problem: Ich hab eine Schleife die bei den jeweiligen Bedingungen bestimmte Werte kopiert. Wenn allerdings kein X,Y oder Z da steht dann soll die Zeile ignoriert oder gelöscht werden und mit der nächsten fortgefahren werden.
Es funktioniert im moment nur wenn der Fall das es immer ein X,Y,Z da steht.
Wie kann ich das ändern?
Danke schon mal

C++:
if (was=="ist")
    {
    // hole dir eine Zeile
    getline(x_ist, zeile);    
        
    // nehme die Zeile, suche nach dem ersten Komma und merke dir die Stelle
    int pos1 = zeile.find(',', 0);
        
    // nehme die Zeile, suche nach dem zweiten Komma und merke dir die Stelle
    int pos2 = zeile.find(',', pos1);

             //wenn der Buchstabe vor dem Komma ein X,Y oder Z ist dann kopiere die
             //Zahl zwischen den beiden Kommas raus und wandle sie in ein double um
    if ((zeile[pos1-1]=='X') || (zeile[pos1-1]=='Y') || (zeile[pos1-1]=='Z'))
      return atof(zeile.substr(pos1+1,pos2).c_str());
    else return 0;
        }

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.09.2005, 11:32 Uhr
imhotep
followed the white rabbit


schön wär gewesen, wenn du mal ne Beispielzeile deines Dateiformates für die beiden Fälle gepostet hättest.
Was mir auffällt, das du nicht prüfst, ob die beiden Positionen überhaupt echte Indexe sind, oder hast du das nur weggelassen?

C++:
pos1 = -1;
pos2 = -1;
if (was=="ist")
    {
    // hole dir eine Zeile
    getline(x_ist, zeile);    
        
    // nehme die Zeile, suche nach dem ersten Komma und merke dir die Stelle
    int pos1 = zeile.find(',', 0);
    //pos1 muss größer als 0 sein, weil du später pos1-1 macht und das zu einem fehler führen würde
    if (pos1 > 0 && pos1 < zeile.size()) {
        
      // nehme die Zeile, suche nach dem zweiten Komma und merke dir die Stelle
      int pos2 = zeile.find(',', pos1);
      //pos2 größer als pos1+1 sonst steht zwischen den zwei Kommas nichts
      if (pos2 > pos1+1 && pos2 < zeile.size()) {

             //wenn der Buchstabe vor dem Komma ein X,Y oder Z ist dann kopiere die
             //Zahl zwischen den beiden Kommas raus und wandle sie in ein double um
        if ((zeile[pos1-1]=='X') || (zeile[pos1-1]=='Y') || (zeile[pos1-1]=='Z'))
           return atof(zeile.substr(pos1+1,pos2).c_str());
        else return 0;
      } else return 0;
    else return 0;
}



Man könnte das vielleicht auch eleganter in eine switch-Anweisung packen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.09.2005, 11:55 Uhr
~Realmastermerlin
Gast


Ja hier mal ein Paar beispielzeilen:

LOC1 AX:X, -1.980000, 0.500000, 0.500000, -1.979293, 0.000707
LOC1 AX:Y, 231.290000, 0.500000, 0.500000, 231.066881, -0.223119
LOC1 AX:Z, 0.000000, 0.500000, 0.500000, 0.000246, 0.000246
LOC1 AX:D, 8.000000, 0.500000, 0.500000, 8.138001, 0.138001
LOC2 AX:X, -2.300000, 0.500000, 0.500000, -1.731509, 0.568491
LOC2 AX:Y, 245.790000, 0.500000, 0.500000, 244.442840, -1.347160
LOC2 AX:Z, 37.000000, 0.500000, 0.500000, 37.077980, 0.077980
LOC2 AX:D, 8.000000, 0.500000, 0.500000, 8.006160, 0.006160
LOC3 AX:X, -2.300000, 0.500000, 0.500000, -2.123368, 0.176632
LOC3 AX:Y, 160.790000, 0.500000, 0.500000, 160.541270, -0.248730
LOC3 AX:Z, 37.000000, 0.500000, 0.500000, 37.142861, 0.142861
LOC3 AX:D, 9.000000, 0.500000, 0.500000, 9.087397, 0.087397
LOC4 AX:X, -1.300000, 0.500000, 0.500000, -1.298096, 0.001904
LOC4 AX:Y, 115.790000, 0.500000, 0.500000, 114.431579, -1.358421
LOC4 AX:Z, 49.500000, 0.500000, 0.500000, 49.459683, -0.040317
LOC4 AX:D, 8.000000, 0.500000, 0.500000, 8.018002, 0.018002
LOC5 AX:X, -2.300000, 0.500000, 0.500000, -2.143148, 0.156852
LOC5 AX:Y, 70.790000, 0.500000, 0.500000, 70.887431, 0.097431
LOC5 AX:Z, 37.000000, 0.500000, 0.500000, 37.127595, 0.127595
LOC5 AX:D, 9.000000, 0.500000, 0.500000, 9.089976, 0.089976
LOC6 AX:X, -2.300000, 0.500000, 0.500000, -1.726204, 0.573796
LOC6 AX:Y, -14.210000, 0.500000, 0.500000, -15.549582, -1.339582
LOC6 AX:Z, 37.000000, 0.500000, 0.500000, 36.957934, -0.042066
LOC6 AX:D, 8.000000, 0.500000, 0.500000, 8.005067, 0.005067
LOC7 AX:X, -1.980000, 0.500000, 0.500000, -1.976415, 0.003585
LOC7 AX:Y, 0.280000, 0.500000, 0.500000, 0.275345, -0.004655
LOC7 AX:Z, 0.000000, 0.500000, 0.500000, 0.018844, 0.018844
LOC7 AX:D, 8.000000, 0.500000, 0.500000, 8.146701, 0.146701
LOC8 AX:X, 20.860000, 0.500000, 0.500000, 22.078804, 1.218804
LOC8 AX:Y, 61.820000, 0.500000, 0.500000, 60.973897, -0.846103
LOC8 AX:Z, 59.660000, 0.500000, 0.500000, 58.946549, -0.713451

Dieser Post wurde am 08.09.2005 um 12:30 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.09.2005, 12:32 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


das zerlegen der zeilen wär ein typischer fall für strtok

Ansonsten seh ich da nicht wie genau du die zeilen einliest? ich seh nur das eine getline, jedoch liest das ja nur eine zeile
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.09.2005, 12:49 Uhr
~Realmastermerlin
Gast


Also zu der Antwort von imhotep. Es ist nicht so das das was herrauskopiert werden soll ein X,Y,Z ist, sondern vor dem ersten komma soll überprüft werden ob ob X,Y,Z steht. Nur dann soll der kopiervorgang gestartet werden. Ansonsten soll die Zeile übersprungen werden. Ich wollte das eigentlich so in der Art lassen. Brauche eben nur die Behandlung des Falls das es kein X,Y,Z ist. Irgendwas in der Richtung: " else delete line". oder sowas in der Art. Hab da aber noch nichts gefunden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.09.2005, 12:54 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja kommt drauf an wie du weiterverarbeitest
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.09.2005, 12:55 Uhr
~Realmastermerlin
Gast


Vieleicht ist es auch besser erst die Datei so zu bearbeiten das alle Zeilen die nicht X,Y,Z heißen zu löschen und dann mit der bereinigten Datei fortzufahren?
Wie heißt der befehl eine Zeile zu löschen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.09.2005, 12:57 Uhr
~Realmastermerlin
Gast


Ich schreib jetzt mal das komplette programm hier rein.

C++:
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <iomanip>
#include "math.h"

using namespace std;

// meine eigene Vektorstruktur
struct vektor
{
    double x_ist;  
    double y_ist;  
    double z_ist;
    double x_soll;
    double y_soll;
    double z_soll;
};

// Kopiert eine Zahl aus einem String
double zahl_kopieren(fstream &x_ist, fstream &x_soll, string was)
{
    // Zeilenstring
    string zeile;
    string temp;
        
    if (was=="ist")
        {
            // hole dir eine Zeile
            getline(x_ist, zeile);    
        
            // nehme die Zeile, suche nach dem ersten Komma und merke dir die Stelle
            int pos1 = zeile.find(',', 0);
        
            // nehme die Zeile, suche nach dem zweiten Komma und merke dir die Stelle
            int pos2 = zeile.find(',', pos1);

            // wenn der Buchstabe vor dem Komma ein X,Y oder Z ist dann kopiere die Zahl zwischen den beiden Kommas raus und wandle sie in ein double um
            if ((zeile[pos1-1]=='X') || (zeile[pos1-1]=='Y') || (zeile[pos1-1]=='Z'))
                return atof(zeile.substr(pos1+1,pos2).c_str());
            else return 0;
        }
    else if (was=="soll")
        {
            // hole dir eine Zeile
            getline(x_soll, zeile);
            int pos_erstes_Komma = zeile.find(',', 0);
        
            // nehme die Zeile, suche nach dem letzten Komma, schneide dort den String ab
            // und merke dir die Stelle
            int pos2 = zeile.rfind(',');
            temp=zeile.substr(0,pos2);
    
            // nehme den abgeschnittenen String, suche nach dem letzten Komma und merke dir die Stelle
            int pos1 = temp.rfind(',');
            
            // wenn der Buchstabe vor dem Komma ein X,Y oder Z ist dann kopiere die Zahl zwischen den beiden Kommas raus und wandle sie in ein double um
            if ((zeile[pos_erstes_Komma-1]=='X') || (zeile[pos_erstes_Komma-1]=='Y') || (zeile[pos_erstes_Komma-1]=='Z'))
                return atof(zeile.substr(pos1+1,pos2).c_str());
            else return 0;
        }
    else return 0;
}

// Hauptprogramm
int main(int argc, char* argv[])
{
    /* -------------------------------------------------------------------- */
    string name = "Teil1";            // Dateiname der Istwertdatei
    string endung = "txt";                        // Dateiendung
    /* -------------------------------------------------------------------- */
    
    // Hilfsvariablen festlegen (werden vom Programm automatisch gefüllt)
    string input = name + "." + endung;
    string output= name + "." + "bmd";            // Dateiname der Zieldatei
    fstream x_ist, x_soll, ausgabe;                // Dateipointer
    int zeilen=0;                                // Anzahl der Zeilen der Tabelle
    
    /* -------------------------------------------------------------------- */
    //             Behandlung der Eingabe-Datei
    /* -------------------------------------------------------------------- */
    
    // mein Datenvektor, Datei darf maximal 1000 Zeilen haben
    vektor *daten = new vektor[1000];    
    
    // Datei zum Lesen öffnen und die IST-Werte einlesen
    x_ist.open(input.c_str(), ios::in);
          
    // Solange wie das Dateiende noch nicht erreicht ist
    zeilen=0;
    while (!x_ist.eof())
    {
        daten[zeilen].x_ist = zahl_kopieren(x_ist, x_soll, "ist");  
        daten[zeilen].y_ist = zahl_kopieren(x_ist, x_soll, "ist");
        daten[zeilen].z_ist = zahl_kopieren(x_ist, x_soll, "ist");

        // zähle die Zeilen
        zeilen++;
    }
    
    x_ist.close();

    // Datei zum Lesen öffnen und die SOLL-Werte einlesen
    x_soll.open(input.c_str(), ios::in);
          
    // Solange wie das Dateiende noch nicht erreicht ist
    zeilen=0;
    while (!x_soll.eof())
    {
        daten[zeilen].x_soll = zahl_kopieren(x_ist, x_soll, "soll");  
        daten[zeilen].y_soll = zahl_kopieren(x_ist, x_soll, "soll");
        daten[zeilen].z_soll = zahl_kopieren(x_ist, x_soll, "soll");

        // zähle die Zeilen
        zeilen++;
    }
    
    x_soll.close();

    /* -------------------------------------------------------------------- */
    //             Behandlung der Ausgabe-Datei
    /* -------------------------------------------------------------------- */
    
    // neue Zeilen zählen
    int zeilen_neu=0;
    int i=0;

    while (i<zeilen)
    {
        if (daten[i].x_ist!=0.0) zeilen_neu++;
        i++;
    }
    
    // Datei zum Schreiben öffnen
    ausgabe.open(output.c_str(), ios::out);
          
    // Name in die 1. Zeile schreiben
    ausgabe << name << endl;

    // zeilenlänge in die 2. Zeile schreiben
    ausgabe << zeilen_neu << endl;
    
    // schreiben des Tabellenkopfes
    ausgabe << "xist;yist;zist;xsoll;ysoll;zsoll" << endl;

    //Schreibe die Daten in die Ausgabe-Datei
    i=0;
    while (i<zeilen_neu)
    {
        if (daten[i].x_ist!=0.0)
        {
            ausgabe << fixed << setprecision (6) << daten[i].x_ist
                    << fixed << setprecision (6) << "; " << daten[i].y_ist  
                    << fixed << setprecision (6) << "; " << daten[i].z_ist  
                    << fixed << setprecision (6) << "; " << daten[i].x_soll  
                    << fixed << setprecision (6) << "; " << daten[i].y_soll  
                    << fixed << setprecision (6) << "; " << daten[i].z_soll
                    << endl;
        }

        i++;
    }
    
    ausgabe.close();

    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.09.2005, 13:07 Uhr
imhotep
followed the white rabbit


Vielleicht wär eine Kombination aus beidem denkbar.
1. Fall es ist eine x-y-z Zeile, dann Zahl kopieren und Zeile in eine neue "bereinigte" Datei kopieren
2. Fall es ist eine andere Zeile, dann nur Zeile einlesen, aber nix tuen.

Zum Schluss den Namen der neuen Datei ausgeben und mit dieser weiterarbeiten, oder die alte mit der neuen überscheiben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
08.09.2005, 13:22 Uhr
~Realmastermerlin
Gast


Kann ich nicht irgendwie else return (gehe zur nächsten zeile) machen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


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: