Anfänger: Will Datei in Array einlesen



  • Hallo!

    Ich habe gerade meine ersten Erfahrungen in C++ hinter mir. Microsofts Visual C++ habe ich wieder an die Wand geknallt, weil ich damit nicht zurecht gekommen bin, obwohl ich vor Jahren mal intensiv mit Borlands Delphi gearbeitet habe. Dank Sprachen wie AutoIt (http://www.autoit.de) sind mir grundsätzliche Begriffe vom Programmieren schon bekannt.
    Mir ist auch klar, dass man C++ nicht sofort kann, aber ich weiß nicht, was ich falsch mache, wenn ich über eine Stunde im Internet und hier im Forum Code suche, um ein Codebeispiel zu finden, dass mir Text aus einer Textdatei zeilenweise zurückliefert.

    Meine Textdatei sieht wie folgt aus:

    ; erste Zeile
    #include <file.au3>
    
    ; Kommentar
    MsgBox(0, "Test", "geht noch, trotz cleaing")
    ; noch ein Comment
    #cs
    Laaaaaanger
    Kommmentar
    von mir... Weg damit!
    #ce
    
    MsgBox(0, "Test2", "geht immmer noch, trotz cleaing!")
    ; letze Zeile
    

    Die einzelne Zeile kann aber bis zu 4096 Zeichen lang sein.

    Diese Datei will ich per Kommandozeile übergeben lassen (den Dateinamen bekommee ich schon korrekt, das passt also) und dann daran ein bisschen rumparsen (Kommentare entfernen und so).

    Mein bisheriger Code sieht so aus:

    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <stdio.h>
    #include <fstream>
    
    using namespace std;
    
    char zeichen;
    
    int main(int argc, char *argv[])
    {
    
        // Vars
        int clean_type; 
        string dest_path;
        string lines[20000];
        string temp_line = "";
        int line_nr;
    
        //int i;
        //for (i=0;i<argc;i++)
        //printf(" argv[%d]  %s\n", i, argv[i]);
    
        // Anzahl der Kommandozeilenparameter auswerten
        if (argc == 1)
        {
             cout << "Fehler: Keine Kommandozeilenparameter angegeben.";
             system("PAUSE");
             return -1;
        } else {
             // Parameter auswerten
             // Quelldateipfad         
             // Aufräumaufgaben
             if (argc == 3)
             {
                clean_type = (int)argv[2];
             }
             // Zielpfad
             if (argc == 4)
             {
                dest_path = argv[3];
             } else {
                dest_path = argv[1]; // + ".tidy";    
             }
    
             // Datei öffnen und in Array einlesen
             long begin,end;
             ifstream work_file(argv[1]);         
             line_nr = 1;
             // Zeilen lesen und in Array tun
    
             while (!work_file.eof())
             {
                   work_file.get(zeichen);
                   if (zeichen != "n")
                   {
                      temp_line = temp_line + zeichen;            
                   } else {
                      lines[line_nr] = temp_line;
                      line_nr++;
                      temp_line = "";                      
                   }
                   cout << zeichen;
             }
    
             work_file.close();        
    
             // Datei schreiben
             /*ofstream myfile;
             myfile.open ("example.txt");
             myfile << "Writing this to a file.\n";
             myfile.close();
             return 0;*/         
    
             cout << "\n\n";         
             system("PAUSE");
             return EXIT_SUCCESS;
        }
    }
    

    Daran motzt mein Dev-C++ 4.9.9.2 aber kräftig rum:
    z.B.

    56 Y:\Programmieren\C_C++\Projekte\CleanScript\main.cpp ISO C++ forbids comparison between pointer and integer
    58 Y:\Programmieren\C_C++\Projekte\CleanScript\main.cpp `c_str' has not been declared
    58 Y:\Programmieren\C_C++\Projekte\CleanScript\main.cpp request for member of non-aggregate type before ';' token

    Für Hilfe wäre ich echt dankbar!

    peethebee



  • Markier mal bitte die Stellen im code, bei denen die Fehlermeldungen kommen.

    Das schonmal vorweg. Wenn du ein Zeichen prüfen willst, dann nicht so

    zeichen != "n"
    

    sondern so

    zeichen != 'n'
    

    .



  • Hallo!

    Ich habe zwar nach "\n" suchen wollen (sonst macht es ja keinen Sinn, an allen Ns zu splitten 😉 ), aber dein Tipp war Gold wert 👍 .
    Leider finde ich so einfach Sachen bei C++ viel zu selten. Einfach traurig...
    Naj, egal, danke erst mal, wenn es wieder hakt, melde ich mich einfach wieder hier.

    peethebee



  • peethebee schrieb:

    #include <cstdlib>
    
    // #include <stdio.h>
    // heißt in C++
    #include <cstdio>
    
    #include <iostream>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    char zeichen; // warum global?
    
    int main(int argc, char *argv[])
    {
        int clean_type;
        string dest_path;
        string lines[20000];
        string temp_line = "";
        int line_nr;
       
        // Anzahl der Kommandozeilenparameter auswerten
        if( argc == 1 ) {
    
            cout << "Fehler: Keine Kommandozeilenparameter angegeben." << endl;
             
            // system( "PAUSE" ); ist nicht sonderlich elegant
            cin.clear( );
            cin.ignore( cin.rdbuf( )->in_avail( ) );
            cin.get( );
    
            // return -1; Main sollte entweder EXIT_FAILURE oder EXIT_SUCCESS zurückgeben:
            return EXIT_FAILURE;
    
        } else {
    		
            // deine Auswertung der Argumente versteh ich nicht -->
    
            if( argc == 3 ) {
    			
                clean_type = ( int )argv[ 2 ]; // wofür!?
            }
    
            if( argc == 4 ) {
    			
                dest_path = argv[ 3 ];
    		
            } else {
    			
                dest_path = argv[ 1 ];
            }
    
            // <--
    		
            long begin, end; // wofür? Du verwendest sie nie.
            
            ifstream work_file( argv[1] );
    		
            line_nr = 1; // dir ist schon klar, dass C-Arrays bei Index [ 0 ] beginnen!?
             
            while ( !work_file.eof() ) {
    			 
                work_file.get( zeichen );
    
                // if( zeichen != "n" )
                // du meinst wohl:
                if( zeichen != '\n' ) {
    				 
                    // temp_line = temp_line + zeichen;
                    // kürzer:
    
                    temp_line += zeichen;
    			 
                } else {
    				 
                    lines[ line_nr ] = temp_line;
                    line_nr++;
                    temp_line = "";
                }
                cout << zeichen;
            }
             
            work_file.close();
    
            /*
            cout << "\n\n";
            system("PAUSE");
            return EXIT_SUCCESS;
    		 
            wohl eher außerhalb des else-Zweigs
            */
        }
    
        cout << endl << endl;
    
        cin.clear( );
        cin.ignore( cin.rdbuf( )->in_avail( ) );
        cin.get( );
    
        return EXIT_SUCCESS;
    }
    

    eher so:

    #include <string>
    #include <vector>
    #include <fstream>
    #include <iostream>
    
    using namespace std;
    
    int main( int argc, char *argv[ ] )
    {
        if( argc != 3 ) {
    
            cout << "usage: fooapp [input file] [output file]" << endl << endl;
            return EXIT_FAILURE;
        }
    
        ifstream input( argv[ 1 ] );
        ofstream output( argv[ 2 ] );
    
        if( input.fail( ) ) {
    
            cout << "The input file \"" << argv[ 1 ] << "\" could not be opened!" << endl << endl;
            return EXIT_FAILURE;
        }
    
        if( output.fail( ) ) {
    
            cout << "The output file \"" << argv[ 2 ]  << "\" could not be created!" << endl << endl;
            return EXIT_FAILURE;
        }
    
        vector< string > input_data;
        string tmp;
    
        while( !input.eof( ) ) {
    
            getline( input, tmp, '\n' );
            input_data.push_back( tmp );
    
            cout << input_data[ input_data.size( ) - 1 ] << endl;
        }
    
        input.close( );
        output.close( );
    }
    

    Greetz, Swordfish


Anmelden zum Antworten