zwei char-arrays vergleichen...



  • danke



  • ich bekomme merkwürdigerweise trotzdem immer ein false
    das ist der inhalt von "buffer":

    eagle-usb status display
    -------------------------------------------------------------
    Driver version 2     Chipset: Eagle1
    Vendor ID : 0x1110     Product ID : 0x900f   Rev: 0x408b
    USB Bus : 001    USB Device : 007        Dbg mask: 0x0
    Ethernet Interface : eth1
    MAC: 00:30:84:b6:65:bb
    Tx Rate         160  Rx Rate        1184
    FEC               0  Margin           29  Atten            29 dB
    VID-CPE          28  VID-CO           28  HEC               0
    VPI               1  VCI              32  Delin          GOOD
    Cells Tx        405  Cells Rx       1297
    Pkts Tx         144  Pkts Rx         134
    OAM               0  Bad VPI           1  Bad CRC           0
    Oversiz.          0
    
    Modem is operational
    

    und das von "test":

    operational
    

    etwas kompliziert aber irgenwo müsster er doch operational finden...



  • ich glaube strcmp ließt nur bis zu einem \n ... lösch die also zuerst ...



  • gibts dazu auch ne einfache funktion



  • strcmp vergleicht die kompletten Strings, deswegen heißt es ja auch strcmp.
    Nimm Caipis Lösung:

    bool adsl_test = strstr(buffer, test) != NULL;
    


  • ist immer 0, merkwürdig

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
    
    #include <iostream>
    #include <cstdlib>
    #include <stdio.h>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char *argv[]) {
      char buffer[8096];
      char *test = "operational";//"initializing(INITIALIZING)";
      FILE *eagle; 
      eagle = popen( "eaglestat", "r" );
    
      if(eagle == NULL) {
        fprintf(stderr,"Konnte keine Pipe zu fglrx erstellen!\n");
        exit(0);
      }
      /* Read pipe until end of file. End of file indicates that
      * FILE closed its standard out (probably meaning it
      * terminated).
      */
    
      while( !feof( eagle ) ) {
        if( fgets( buffer, 8096, eagle ) != NULL );
        printf( buffer );
      }
    
      /* Close pipe and print return value of FILE. */
      //printf( "\nProcess returned %d\n", pclose( eagle ) );
    
      bool adsl_test = strstr(buffer, test) != NULL;  
    
      cout<<adsl_test<<endl;
    
      return EXIT_SUCCESS;
    }
    


  • Arbeite mit std::string und nimm meins. Wir sind hier ja schließlich bei C++ und nicht bei C.



  • ja würde ich machen aber leider gibt mir

    string sbuffer = buffer;
    

    nichts aus...):
    probier doch mit dem bsp-code aus



  • So müsste es Funktionieren:

    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
            if(argc == 2)
            {
                    ifstream eagle(argv[1]);
                    if(eagle.is_open())
                    {
                            string buffer(""), test("operational"), tmpStr;
                            while(getline(eagle, tmpStr))
                                    buffer += tmpStr + '\n';
    
                            bool adsl_test = (buffer.find(test) != string::npos);
                            cout << "\n adsl_test: " << adsl_test << endl;
                    }
                    else
                            cout << "\n Datei \'" << argv[1] << "\' konnte nicht zum lesen geoeffnet werden\n";
            }
            else
                 cout << "\n Aufruf: test.exe txt-Datei\n";
    
            return 0;
    }
    

    Caipi



  • danke caipi... hab jetzt auch ne lsg.

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
    
    #include <iostream>
    #include <cstdlib>
    #include <stdio.h>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char *argv[]) {
      char buffer[8096];
    
      string ready = "operational";
      string init = "initializing(INITIALIZING)";
      string un_plugged = "Pre-firmware device";
      //string working = "Connection seems to be already started!";
    
      string sbuffer;
    
      FILE *eaglestat; 
      eaglestat = popen( "eaglestat", "r" );
    
      if(eaglestat == NULL) {
        fprintf(stderr,"Konnte keine Pipe zum Modem erstellen!\n");
        exit(0);
      }
    
      /* Read pipe until end of file. End of file indicates that
      * FILE closed its standard out (probably meaning it
      * terminated).
      */
      while( !feof( eaglestat ) ) {
        if( fgets( buffer, 8096, eaglestat ) != NULL );
        sbuffer += buffer;
      }
    
      /* Close pipe and print return value of FILE. */
      printf( "\nProcess returned %d\n", pclose( eaglestat ) );   
    
      //operrational
      bool adsl_ready = (sbuffer.find(ready) != string::npos);
      //initializing
      bool adsl_init = (sbuffer.find(init) != string::npos);
      //unplugged
      bool adsl_nw = (sbuffer.find(un_plugged) != string::npos);
    
      //working
      //bool adsl_working = (sbuffer.find(working) != string::npos);
    
      //cout<<adsl_test<<endl;
    
      return EXIT_SUCCESS;
    }
    

    ps: wozu ist eigentlich das

    int argc, char *argv[]
    

    in der main funktion da??



  • dotnet schrieb:

    ps: wozu ist eigentlich das

    int argc, char *argv[]
    

    in der main funktion da??

    Das ist sozusagen die Parameterübergabe an die main()-Funktion. D.h. ich übergebe der main()-Funktion direkt aus der Konsole heraus Argumente.
    Im Beispiel übergebe ich der main-Funktion als argv[1] (argv[0] ist das Programm bzw. der Programmname selber) den Dateinamen, der zu öffnenden Datei. (Faulheit's halber ;))

    test.exe die_zu_lesende_datei
       |             |
     argv[0]       argv[1]
    

    Caipi



  • argv[] gibt die Parameter zurück, wobei argv[0] der Dateiname selbst ist und ab argv[1] sind es dann alles Parameter. Das ist klar. Aber woher weiß ich, wieviel Platz indiesem Array vorhanden ist? Letztendlich gibt es ja keine feste Definition von argv[]... Geht das z.B. noch, wenn man 257 Parameter hat? *g*
    Soweit ich weiß ist argc die Anzahl der Parameter, komme aber damit irgendwie ned so richtig zurecht ^^"



  • Die maximale Anzahl der comandozeileparameter ist festgelegt aber IMHO OS-abhängig.
    Argc (argumentcount) ist wie schon gesagt wurde die anzahl der parameter die übergeben wurde. Wenn also keine parameter angegeben werden ist argc==1, da argv[0] immer der programmname sein sollte. Du hast also immer argc-1 "echte" parameter.

    Um auf die ("echten")parameter zuzugreifen verwendest du einen integer oder auch ne constante n mit 0 < n <= argc als index in das argv-array;

    argv[1]; //erster parameter
    argv[254]; //254ster parameter
    

    sofar


Anmelden zum Antworten