Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Hilfe ich brauche Unterstützung

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 ] [ 3 ]
000
08.01.2013, 20:01 Uhr
denker



Da dies mein erster Post ist, sage ich erstmal ein paar Worte zu meiner Person.

Bin 23 Jahre und mache in diesem Semester meinen Bachelor in Maschinenbau fertig.

In Programmiersprachen (abgesehen von ein bisschen Matlab) bin ich total eingerostet (3 Jahre her).

Nun möchte ich ein Programm schreiben, um einen Prozess zu automatisieren.

welches folgenden Anforderungen genügen soll,

1.Teil
-Messdaten in Form einer .txt Datei einlesen
-alle Kommas durch Punkte ersetzen
-und das umgewandelte wieder als .txt Datei abspeichern (bis auf die zu Punkten gewordenen Kommas soll die Zieldatei Zeichen für Zeichen die Quelldatei wiedergeben )

2.Teil
-Messdaten in Form einer .txt Datei einlesen
-Zahlen einzelner kompletter Spalten (typ double) mit Vorfaktoren mutipizieren
-einzelne Spalten miteinander vergleichen und Werte bestimmter Spalten in die anderen Spalten schreiben


Ist das mit C++ möglich?

könnt ihr mir dabei helfen (ich steh total auf dem Schlauch)

Beispiel der zu bearbeitenden Datei, wobei die Datei über 9000 Zeilen hat:

aufgez.Umdr.: 9
OT n.Synch(°): 329,0000000

Winkel (°) W.mod 360° (°) Zeit (s) Ai4 (V) Ai5 (V)

-329,0000000000 31,0000000000 0,0000197250 0,6895744583 1,5940939457
-328,6484375000 31,3515625000 0,0000394625 0,6900351596 1,0607275646
-328,2968750000 31,7031250000 0,0000591875 0,6877000084 0,6049731131
-327,9453125000 32,0546875000 0,0000789125 0,6896903528 0,2667827491

Dieser Post wurde am 08.01.2013 um 20:02 Uhr von denker editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.01.2013, 21:09 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


natürlich ist das in c++ möglich

mit hilfe der ifstream-klasse kannst du die Datei zum lesen öffnen, dann liest du diese mit getline zeilenweise in einen string ein. mit hilfe eines stringstreams kannst du dann die einzelnen double einlesen. Wenn du ein passendes locale setzt, sogar mit komma. Ansonsten vorher im string die kommas durch punkte ersetzen.

die Daten selbst kannst du z.b mit Hilfe der boost::mtl (matrix-template-library) in eine (relativ einfach) zu bedienende Matrix umwandeln, mit hilfe dieser kannst du dann ähnlich wie in matlab die spalten etc be- bzw. verarbeiten.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.01.2013, 13:23 Uhr
~denker
Gast


Wie kann ich z.B

wenn ich gesagt habe:

ifstream dateiRead

und dadurch z.B. sagen kann

dateiRead.getline

char z
dateiRead.get(z)

das gleiche mit einem

vec[i][j]

machen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.01.2013, 17:07 Uhr
denker



Die Ausgangsdatei:


Zitat:

aufgez.Umdr.: 9
OT n.Synch(°): 329,0000000

Winkel (°) W.mod 360° (°) Zeit (s) Ai4 (V) Ai5 (V)

-329,0000000000 31,0000000000 0,0000197250 0,6895744583 1,5940939457
-328,6484375000 31,3515625000 0,0000394625 0,6900351596 1,0607275646
-328,2968750000 31,7031250000 0,0000591875 0,6877000084 0,6049731131
-327,9453125000 32,0546875000 0,0000789125 0,6896903528 0,2667827491



wurde von mir jetzt umgewandelt in folgende:


Zitat:

-329.0000000000 31.0000000000 0.0000197250 0.6895744583 1.5940939457
-328.6484375000 31.3515625000 0.0000394625 0.6900351596 1.0607275646
-328.2968750000 31.7031250000 0.0000591875 0.6877000084 0.6049731131
-327.9453125000 32.0546875000 0.0000789125 0.6896903528 0.2667827491



Mein Code sieht so aus:

C++:
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
#include <math.h>
using namespace std;
//---------------------------------------------------------------------------

int main()
{
    ifstream dateiRead; /* Objekt der Eingabe-Datei */
    ofstream dateiWrite; /* Objekt der Ergebnis-Datei */
    ofstream dateiSchreib; /* Objekt der Ergebnis-Datei */
    char string[256];

    /* Dateiname eingeben */
    //string dateiname;
    cout << "Komma zu Punkt Konverter fuer Dezimalzahlen" << endl;
    cout << "Eingabe des Dateinamens (mit Dateiendung):" << endl;
    char dateiname[40];
    cin >> dateiname;
        
    dateiRead.open(dateiname, ios::in);
    /* Eingabeprüfung */
    if (!dateiRead.good())
    cout << "Konnte Datei zum Lesen nicht oeffnen" <<endl;
    else
    {
        dateiSchreib.open("Ziel2.txt", ios::out);
        dateiWrite.open(dateiname, ios::out);
        if (!dateiWrite.good())
        {
        cout << "Konnte Datei zum Schreiben nicht oeffnen." << endl;
        }
        else
    {
        /* sieben Überschriftenzeilen holen: Erstelldatum, Drehzahl und so weiter
k ommt alles in eine weitere .txt File und wird am Ende wieder mit den Zahen zusammengebastelt, damit ich eine Datei habe (Ziel.txt), weche nur Zahlen enthält */

    for (int i=0;i<7;i++)
    {
        dateiRead.getline(string, 255);
        dateiSchreib << string <<endl;
    }
    /* Bei der Zahlenfolge Komma durch Punkt ersetzen */
    char z;
            while ( dateiRead.get(z)) { // mit der Methode "get" eines "streams" ein Zeichen in "zeichen" einlesen
                    if(z==44)
                    {
                        z=46 ;
                    }    
                    dateiWrite << z;
            }
    }
    }
    dateiWrite.close();
    dateiSchreib.close();
    dateiRead.close();
     /* if (!dateiRead.good() if !dateiWrite.good() */
    
    ifstream dateiReading;
    ifstream dateiReader;
    ofstream dateiWriting;

    dateiReading.open(/*"dateiname"*/"Ziel.txt", ios::in);
    dateiReader.open(/*"dateiname"*/"Ziel2.txt", ios::in);
    
    dateiWriting.open("Ziel3.txt", ios::out);    

/*
Hier muss der Hauptcode rein, welcher die Zahlen in Vektorelemente oder Matrizen bringt,
Sie müssen dann aber auch noch für arithmetische Operationen zur verfügung stehen

Auch untereinander bzw austauschbar
*/
    

    dateiReader.close();
    dateiReading.close();
    dateiWriting.close();
    remove("Ziel2.txt");
    remove("Ziel3.txt");
    return 0;
    }



Ich möchte gern wissen wie ich große Zahlentabellen in 2dimensionale Vektoren oder Arrays einlesen mathematisch bearbeiten und dann speichern kann, wobei der output wieder die gleiche Struktur haben soll, da ich nur Elemente von drei der fünf Spalten mathematisch bearbeiten oder miteinander austauschen will.

Wenn jemand ein einfaches Beispiel posten könnte, mit input.txt und output.txt, wäre das toll.

Dieser Post wurde am 09.01.2013 um 17:16 Uhr von denker editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.01.2013, 22:57 Uhr
~denker
Gast


ich poste morgen mittag ein weiteres update, wenn ich ein code schnipsel hinzugefügt habe. Wäre cool, wenn ich dann vlt Hilfe bekommen könnte, denn danach wirds hart.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.01.2013, 18:27 Uhr
~denker
Gast



C++:
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string.h>
#include <vector>
#include <math.h>
#include <stdio.h>
using namespace std;
//---------------------------------------------------------------------------

int main()
{
    ifstream dateiRead; /* Objekt der Eingabe-Datei */
    ofstream dateiWrite; /* Objekt der Ergebnis-Datei */
    ofstream dateiSchreib; /* Objekt der Ergebnis-Datei */
    char string[256];
    /* Dateiname eingeben */
    //string dateiname;
    cout << "Komma zu Punkt Konverter fuer Dezimalzahlen" << endl;
    cout << "Eingabe des Dateinamens (mit Dateiendung):" << endl;
    char dateiname[40];
    cin >> dateiname;
    dateiRead.open(dateiname, ios::in);
    /* Eingabeprüfung */
    if (!dateiRead.good())
    cout << "Konnte Datei zum Lesen nicht oeffnen" <<endl;
    else
    {
        dateiSchreib.open("Ziel2.txt", ios::out);
        dateiWrite.open("Ziel.txt", ios::out);
        if (!dateiWrite.good())
        {
        cout << "Konnte Datei zum Schreiben nicht oeffnen." << endl;
        }
        else
    {
            /* sieben Überschriftenzeilen holen: Erstelldatum, Drehzahl und so weiter*/
        for (int i=1;i<8;i++)
        {
            dateiRead.getline(string, 255);
            dateiSchreib << string <<endl;
        }
        /* Bei der Zahlenfolge Komma durch Punkt ersetzen */
        char z;
        while ( dateiRead.get(z))
        {
                
            if(z==44)
            {
                z=46 ;
            }    
            dateiWrite << z;
        }
        }
    }
    
    dateiWrite.close();
    dateiSchreib.close();
    dateiRead.close();
    
/*    ifstream dateiSchreie;                                        //hier wil ich einen Wert aus Ziel2.txt einesen und als double speichern
    
    dateiSchreie.open("Ziel2.txt", ios::in);
    double q;
    for (int i=1;i<4;i++)
    {
          dateiSchreie.getline(string,256);
        ++i;
        if(i=3)
        {
        q=atof(string);
        }    
    }
    cout << q;
    
    dateiSchreib.close();
*/
    

    //  Variablen deklarieren
    char Zeile[100];
    char *token;
    int x = 0;
    int y = 0;
    int z = 0;    
    fstream File;
    File.open("Ziel.txt",ios::in);
    if(!File) {
        cerr << "Datei konnte nicht geöffnet werden" <<endl;
        exit(1);
    }
    while (!File.eof())
    {
        File.getline(Zeile,100);
        ++z;
    }
    File.close();
    
    double Array[z][7];
    File.open("Ziel.txt",ios::in);
    while (!File.eof())
    {
        File.getline(Zeile,100);
        token = strtok(Zeile," \t");
        x=0;
        while (token)
            {
                Array[y][x] = atof(token);
                token = strtok(NULL," \t");
                ++x;
            }
        ++y;
    }
    /*
    double temp;                                             //variable zum späteren tauschen von Elementen des Feldes
    double aa;                                               //Feste Werte as Referenz für den tausch der Elemente :heißt wenn dass erste Element einer Zeile größer ist als ein bestimmter Wert, zB Winkelgröße
    double bb;

    aa=135;
    bb=405;
    
    double p;                                               //Faktoren zum anpassen der Feldelemente (nicht deren Indizes sondern der Inhalt) zB um  k*-0.61 zu machen wenn gilt A[i][j]=-0.61 sol rauskommen k* A[i][j]=k*-0.61
    double k;
    k=0;                                                     //Kontrollvariable
    
    for(int j=0;j<=z;++j)                                      //ab hier will ich nochmal das Array durchaufen zum rechnen und tauschen
    {                                                        //durchlaufen der Spalten
        
        for(int i=0;i<=6;++i)                                 //durchlaufen der Zeilen
        {
            if(Array[1][j]>=bb;Array[1][j]>=bb;k=0)          //dabei muss das 1. Element der Zeile größer als ein bestimmter Wert und kleiner als ein anderer Wert sein
            {                                                //ab hier will ich Elemente einer  Zeile vergleichen und gegebenenfals tauschen,
                p=0;
                if((Array[4][j]*2)<Array[3][j])    
                {
                    Array[4][j]=k+Array[3][j];                 //vor dem tausch soll das hintere Element noch mal bearbeitet werden und an dass vordere angepasst werden
                    p++;
                }
                if((Array[4][j])+0.5*(Array[4][j])<Array[3][j])
                {
                    Array[4][j]=0.5*k+Array[3][j];            //vor dem tausch soll das hintere Element noch mal bearbeitet werden und an dass vordere angepasst werden
                    p=p+0.5;
                }
                temp = Array[3][j];                            //Tauschvorgang
                Array[3][j] = Array[4][j];
                Array[4][j] = temp;
            }
            
            
            if(Array[1][j]>=bb)
            {
                p=0;
                if((Array[4][j]*2)<Array[3][j])
                {
                    Array[4][k]=k+Array[3][j];
                    p++;
                }
                if((Array[4][j])+0.5*(Array[4][j]))<Array[3][j])
                {
                    Array[4][j]=0.5*k+Array[3][j];    
                    p=p+0.5;
                }
                temp = Array[3][j];
                Array[3][j] = Array[4][j];
                Array[4][j] = temp;
            }
        }
    }
    */

    int yy;
    ofstream arrayData("array.txt",ios::app);
    for(yy=0;yy<=(z);++yy)
    {
            arrayData<<Array[yy][0]<<"      \t"<<Array[yy][1]<<"\t\t"<<Array[yy][2]<<"  \t"<<Array[yy][3]<<"   \t"<<Array[yy][4]<<"    \t"<<Array[yy][5]<<"   \t"<<Array[yy][6]<<endl;
    }
    return 0;
}



Soweit zum aktuellen, die Kommentare sagen im Code, wo es Probeme gibt.
Für jede Hilfe wäre ich dankbar.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.01.2013, 19:20 Uhr
~f.-th.
Gast


Musst du so einen Spaghetti-Code schreiben? In pur C++ ist das nicht der Brüller. Schreib da übersichtliche Funktionen. Kann dein Compiler schon ein wenig C++11? Nutze C++ Strings konsequenter. Die C-Header in C++ Quelltext müssen nicht sein.

Da du die Daten beim Sortieren noch manipulieren willst, überblicke ich das gerade nicht. Eventuell kannst du da auch einen passenden C++ Container nehmen, der das Sortieren schon von Haus aus macht.

Manchmal machst du es in deinem Quelltext. Warum nutzt du beim Datei-Handling nicht konsequent RAII?

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.01.2013, 20:28 Uhr
~f.-th.
Gast


Damit du siehst wie ein Teil deiner Aufgabe, den du hier gezeigt hast, ein wenig anders umgesetzt wird.

Ich hoffe mal ich habe W. Salomons Ideen richtig umgesetzt.

C++:
#include <iostream>
#include <fstream>
#include <limits> // std::numeric_limits<>

std::istream& skipline( std::istream& in ) // überliest alles bis zum Ende einer Zeile
{
    return in.ignore( std::numeric_limits< std::streamsize >::max(), '\n' );
}

int main()
{
    using namespace std;
    cout << "Komma zu Punkt Konverter fuer Dezimalzahlen\n";
    cout << "Eingabe des Dateinamens (mit Dateiendung):" << endl;
    string dateiname;    // C++11 -> übernächste Zeile
    cin >> dateiname;
    ifstream infilecomma (dateiname); // kein ios::in, da ein 'i'fstream immer 'in' ist
    if (!infilecomma.is_open())
    {
        cout << "Kein File :-(" << endl;
        return 1;
    }
    for( int zl = 0; zl < 3; ++zl ) // 3 Zeilen überlesen -> Anzahl anpassen
        infilecomma >> skipline;

    ofstream outfilepoint ("datapoint.txt");  // kein file ergänzen
    char z;
    while ( infilecomma.get(z))
    {                
        if(z==44)
            z=46 ;  
        outfilepoint << z;
    }
    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.01.2013, 21:13 Uhr
Hans
Library Walker
(Operator)


Hi,

bezüglich der C-Header:


Zitat von ~denker:


C++:
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string.h>  // C-Version; für C++ das ".h" weglassen
#include <vector>
#include <math.h>  // C-Version; in C++ verwendet man <cmath>
#include <stdio.h>  // in C++ komplett überflüssig, da nur für C (ohne ++)
using namespace std;
//---------------------------------------------------------------------------
...





Den Rest hab ich mir (noch) nicht angesehen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.01.2013, 22:17 Uhr
denker




C++:
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string.h>
#include <vector>
#include <cmath>
#include <limits>
using namespace std;
//---------------------------------------------------------------------------

std::istream& skipline( std::istream& in ) // überliest alles bis zum Ende einer Zeile
{
    return in.ignore( std::numeric_limits< std::streamsize >::max(), '\n' );
}

int main()
{
    ofstream dateiWrite; /* Objekt der Ergebnis-Datei */
    ofstream dateiSchreib; /* Objekt der Ergebnis-Datei */
    char string[256];
    /* Dateiname eingeben */
    //string dateiname;
    cout << "Eingabe des Dateinamens (mit Dateiendung):" << endl;
    char dateiname[40];
    cin >> dateiname;
    ifstream dateiRead(dateiname);
    /* Eingabeprüfung */
    while (!dateiRead.eof())
    {
        dateiWrite.open("Ziel.txt", ios::out);
        if (!dateiWrite.good())
        {
        cout << "Konnte Datei zum Schreiben nicht oeffnen." << endl;
        }
        else
    {
        for( int zl = 0; zl < 7; ++zl )
        dateiRead >> skipline;
        /* Bei der Zahlenfolge Komma durch Punkt ersetzen */
    char z;
    while ( dateiRead.get(z))
    {                
        if(z==44)
            z=46 ;  
        dateiWrite << z;
    }
        }
    }
    dateiWrite.close();
    dateiRead.close();
    
    //  Variablen deklarieren
    char Zeile[100];
    char *token;
    int x = 0;
    int y = 0;
    int z = 0;    
    fstream File;
    File.open("Ziel.txt",ios::in);
    if(!File) {
        cerr << "Datei konnte nicht geöffnet werden" <<endl;
        exit(1);
    }
    while (!File.eof())
    {
        File.getline(Zeile,100);
        ++z;
    }
    File.close();
    
    double Array[z][7];
    File.open("Ziel.txt",ios::in);
    while (!File.eof())
    {
        File.getline(Zeile,100);
        token = strtok(Zeile," \t");
        x=0;
        while (token)
            {
                Array[y][x] = atof(token);
                token = strtok(NULL," \t");
                ++x;
            }
        ++y;
    }

    double aa;
    double ot;
    ot=100;
    aa=20+ot;
    int i;
    int j;
    for(int j=0;j<z;++j)                                  
    {                                                        
        for(int i=0;i<=6;++i)    
        {
            if(Array[j][1]>200){
                cout << Array[j][3];
                cout << "\n";
                cout << Array[j][5];
                cout << "\n";
                double temp;
                temp = Array[j][3];
                Array[j][3] = Array[j][5];
                Array[j][5] = temp;
                cout << Array[j][3];
                cout << "\n";
                cout << Array[j][5];
                cout << "\n";
            }
        }
    }
    
    int yy;
    ofstream arrayData("array.txt",ios::app);
    for(yy=0;yy<(z);++yy)
    {
            arrayData<<Array[yy][0]<<"      \t"<<Array[yy][1]<<"\t\t"<<Array[yy][2]<<"  \t"<<Array[yy][3]<<"   \t"<<Array[yy][4]<<"    \t"<<Array[yy][5]<<"   \t"<<Array[yy][6]<<endl;
    }
    return 0;
}



Was noch zu machen ist:

Name der Outputfile = "A" + dateiname //funzt bei mir nicht

Aus Quelldatei

Zitat:

aufgez.Umdr.: 9
OT n.Synch(°): 329,0000000

Winkel (°) W.mod 360° (°) Zeit (s) Ai4 (V) Ai5 (V)

-329,0000000000 31,0000000000 0,0000197250 0,6895744583 1,5940939457
-328,6484375000 31,3515625000 0,0000394625 0,6900351596 1,0607275646
-328,2968750000 31,7031250000 0,0000591875 0,6877000084 0,6049731131
-327,9453125000 32,0546875000 0,0000789125 0,6896903528 0,2667827491


329,0000000 einlesen als double

Inhalt eines Arrayelementes mit Faktor multiplizieren. oder mit Inhalt eines anderen Arrayelementes multiplizieren oder addieren.

Dieser Post wurde am 10.01.2013 um 22:18 Uhr von denker editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ 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: