C++ program starten unter LINUX/UNIX



  • Hallo,

    Bin noch ein Anfänger auf diesem Gebiet 😞
    Ich habe ein kleines C++ Program, das Daten von einem separaten File sortiert.
    Das File befindet sich im folgenden Ordner:

    http://cid-daa1966be9348935.skydrive.live.com/embedicon.aspx/.Public

    Mein Problem ist, dass ich das Program nicht zum laufen bringe.
    Hatte das bisher so gemacht:

    g++ forces.cpp -o test.exe
    

    und dann die .exe datei ausführen.

    Gibt es eine andere Möglichkeit das Program auszuführen.

    Vielen Dank für die Hilfe 🙂

    #include <vector>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <string.h>
    #include <stdlib.h>
    using namespace std; 
    class myItem {
    public:
      myItem(int T, int S, int I, const string& L): Time(T), Section(S), Id(I), Line(L) {}
      int Time, Section, Id;
      string Line;
      bool operator < (const myItem& o) const {
        if (Section != o.Section) return Section < o.Section;
        if (Id != o.Id) return Id < o.Id;
        return Time < o.Time;
      }
    }; 
    int main() {
      string line;
      vector <string> Sections, TableHeads;
      vector <myItem> AllData;
      int curTime, curSection, curId;
      // INPUT
      while (getline(cin,line).good()) {
        cerr << line << endl;
        char dummy;
        if (sscanf(line.c_str()," SOLUTION AT RAMP POINT %*d TIME %d",&curTime) == 1) { 
          // A new ramp point and time, restart sections
          curSection = -1;
        } else if (line.find(':') != string::npos) {
          // A new heading
          string tablehead;
          getline(cin,tablehead);
          curSection++;
          if (Sections.size() <= curSection) {
    	 Sections.push_back(line);
    	 TableHeads.push_back(tablehead);
          }
        } else if (line.find_first_not_of("- \r\n\t")==string::npos) {
          // ignore line
        } else {
          // data line
          int curId = line[0] == '*'? (~0u)>>1 : atoi(line.c_str());
          AllData.push_back(myItem(curTime,curSection,curId,line));
        }
      }
      // SORT
      sort(AllData.begin(), AllData.end());
      // OUTPUT
      curSection = -1; curId = -1;
      for (vector<myItem>::iterator i=AllData.begin(); i!= AllData.end(); i++) {
        if (i->Section != curSection) {
          curSection = i->Section;
          curId = -1;
          printf("\n%s\n", Sections[curSection].c_str());
        }
        if (i->Id != curId) {
          curId = i->Id;
          printf("\nTime %s\n",TableHeads[curSection].c_str()); 
        }
        printf("%02d   %s\n",i->Time, i->Line.c_str());
      }
    }
    


  • Was genau heißt "läuft nicht"?

    Ohne mir den Code irgendwie angesehen zu haben: Sowas sollte funktionieren:
    `g++ -o forces forces.cpp

    ./forces`



  • Hallo,
    Danke für die schnelle Antwort.

    Funktioniert noch nicht ganz. Nach dem Befehl ./forces rechnet der Computer,
    doch kommt zu keinem Ende.

    Kann es sein dass ich in der Zeile "g++ -o forces forces.cpp" noch den Namen
    der Datei eingeben muss (forces_prt.txt) da diese im Program nirgends referenziert ist.

    Grüsse



  • Funktioniert noch nicht ganz. Nach dem Befehl ./forces rechnet der Computer, doch kommt zu keinem Ende.

    Das ist kein Problem des Compilers, sondern des Programms, also des Programmierers, also hast du etwas falsch gemacht.



  • Ok, werde dann mal das Program überarbeiten.



  • alpenkönig schrieb:

    Kann es sein dass ich in der Zeile "g++ -o forces forces.cpp" noch den Namen der Datei eingeben muss (forces_prt.txt) da diese im Program nirgends referenziert ist.

    Nicht, dass ich böse klingen möchte, aber hast Du Dich auch nur im entferntesten damit auseinandergesetzt, was diese magischen Zeilen überhaupt ungefähr machen sollen?

    Diese Zeile kompiliert das Programm, da sind die Eingabedaten völlig uninteressant.

    Im Programm sehe ich ein getline, also musst Du vmtl. einfach ./forces < eingabedaten.txt oder so machen.



  • Nein, du hast schon recht 🕶 ich weiss zwar was am Ende herauskommt, aber den Code habe ich nicht selber geschrieben. Möchte eben versuchen, die Daten in ein separates File zu schreiben, um sie besser bearbeiten zu können, denn jetzt sind sie alle im Command-Fenster aufgeführt, was ja mit diesem Program so sein soll 🙂
    Aber Danke für die Hinweise mit dem Kompilieren.



  • Naja, dann machst Du eben nochmal ./forces < eingabedaten.txt > ausgabedatei.txt . Du solltest Dich ein bisschen mit den grundlegendsten Unix-Grundlagen auseinandersetzen, für sowas sehr praktisch.



  • Hi nman,

    Ich habe mit deine Bemerkung zu Herzen genommen und den Code mal studiert 🕶
    Das mit dem Output file ist jetzt kein Problem mehr da ich einfach im Code selber das so definiert habe.
    Weiters habe ich zwei Header definiert für die Daten ins output file exportiert werden sollen, doch da liegt ist noch ein Haken dran.
    Es kompliliert und durchläuft den Code ohne Fehlermeldungen doch schlussendlich wird einfach nichts im Output file angezeigt 😞
    Ich denke der Fehler liegt bei Zeile 47:

    #include <vector>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <string.h>
    #include <stdlib.h>
    #include <fstream>
    using namespace std; 
    
    class myItem {
    public:
      myItem(int T, int S, int I, const string& L): Time(T), Section(S), Id(I), Line(L) {}
      int Time, Section, Id;
      string Line;
      bool operator < (const myItem& o) const {
        if (Section != o.Section) return Section < o.Section;
        if (Id != o.Id) return Id < o.Id;
        return Time < o.Time;
      }
    }; 
    int main() {
      string line;
      string tablehead;
      string header1 = "FORCES FROM REACTIONS AT POINT TIES:";
      string header2 = "FORCES FROM REACTIONS AT RESTRAINED FACES :";
      vector <string> Sections, TableHeads;
      vector <myItem> AllData;
      int curTime, curSection, curId;
      // INPUT
      while (getline(cin,line).good()) {
        cerr << line << endl;
        char dummy;
        if (sscanf(line.c_str()," SOLUTION AT RAMP POINT %*d TIME %d",&curTime) == 1) { 
          // A new ramp point and time, restart sections
          curSection = -1;
        } else if (line.find(':') != string::npos) {
          // A new heading
          string tablehead;
          getline(cin,tablehead);
          curSection++;
          if (Sections.size() <= curSection) {
    	 Sections.push_back(line);
    	 TableHeads.push_back(tablehead);
          }
        } else if (line.find_first_not_of("- \r\n\t")==string::npos) {
          // ignore line
        } else if ( tablehead==header1 || tablehead==header2 ) {
          // data line
          int curId = line[0] == '*'? (~0u)>>1 : atoi(line.c_str());
          AllData.push_back(myItem(curTime,curSection,curId,line));
        } 
      }
      // SORT
      sort(AllData.begin(), AllData.end());
      // OUTPUT
      std::ofstream output ("//gt//home//h113027//GT26//forces_moments//final1//output.txt"); 
    
      curSection = -1; curId = -1; 
      for (vector<myItem>::iterator i=AllData.begin(); i!= AllData.end(); i++) { 
        if (i->Section != curSection) { 
          curSection = i->Section; 
          curId = -1; 
          output << Sections[curSection].c_str() << std::endl; 
        } 
        if (i->Id != curId) { 
          curId = i->Id; 
          output << "\nTime " << TableHeads[curSection].c_str() << std::endl; 
        } 
        output << i->Time << std::endl << i->Line.c_str() << std::endl; 
      } 
      output.close(); 
    }
    


  • Arbeite doch bitte einfach wie oben vorgeschlagen mit einer Shell-Umleitung per ">".

    Warum hast Du in der Pfadangabe zur Ausgabedateien lauter doppelte Slashes drin? Unter Windows brauchst Du Doppel-Backslashes, weil ein einfacher Backslash Escape-Sequenzen einleitet. Bei normalen Slashes ist das allerdings nicht der Fall.



  • Da ich mit Linux arbeite, muss ich die Doppel-slash für die Pfadnamen verwenden.

    Das output-file habe ich schon in den Code implementiert, habe es auch erfolgreich mit der Shell-Umleitung probiert.
    Das einzige Frage ist, wie ich nur einen Teil der Daten exportieren kann. So weit ich weiss komme ich da nur mit ">" auch nicht weiter.
    Aber danke für den Hinweis...



  • alpenkönig schrieb:

    Da ich mit Linux arbeite, muss ich die Doppel-slash für die Pfadnamen verwenden.

    Blödsinn. Musst Du nicht und solltest Du nicht.
    Auch unter Unix leitet / keine Escapesequenzen ein, sondern \. Pfadnamen beinhalten daher einfache Slashes, keine doppelten.

    Das output-file habe ich schon in den Code implementiert, habe es auch erfolgreich mit der Shell-Umleitung probiert.
    Das einzige Frage ist, wie ich nur einen Teil der Daten exportieren kann. So weit ich weiss komme ich da nur mit ">" auch nicht weiter.

    Doch, wenn Du zB. einen Teil auf stderr und einen Teil auf stdout ausgibst oder so. Aber keine Ahnung, was genau Du machen magst.


Log in to reply