Zeile mit Leerzeichen und gleichzeitigen Rename oder Copy?



  • Hallo Community,

    ich brauche wirklich eure Hilfe. Ich bin total verzweifelt.:-(

    Das Programm soll die erste Zeile der per Parameter übergebenen Datei auslesen und diese Datei mit neuem Namen speichern.
    Der neue Name, soll die zuvor ausgelesene Zeile sein.
    **
    Mein Problem:**

    1. Mein Programm liest zwar die erste Zeile schreibt aber keine neue Datei, da in der ersten Zeile Leerzeichen vorkommen.

    2. Wenn ich die Leerzeichen aus der Ursprungsdatei entferne, schreibt er eine neue Datei allerdings ohne Dateiendung .txt und ohne Inhalt der Ursprungsdatei, sie ist also leer.

    Ich würde wirklich gerne wissen, was ich falsch gemacht habe. Ich komme seit Stunden nicht weiter...

    Bitte bitte helft mir. Danke

    int main(int argc, char *argv[])
    {
        ifstream f;  // Datei-Handle
          string s;
    
        f.open(argv[1]); // Öffne Datei aus Parameter
    
        if(getline(f,s)) //Erste Zeile der MIBFEHL Dateien auslesen
        {
           cout << s << endl;
           ofstream o(s.c_str());
           while(f.getline(f,s))
              o << s << flush;
        }
        else
           cout << "Fehler aufgetreten" << endl;
        return 0; 
    
    }
    


  • hmm ...

    #include <iostream>
    #include <fstream>
    #include <string>
    
    int main(int argc, char *argv[])
    {
        if (argc < 2 || argc > 2)
        {
            std::cerr << "Usage: " << argv[0] << " srcfile" << std::endl;
            return 0;
        }
        std::ifstream file_in(argv[1])
        if (!file_in)
        {
            std::cerr << "Could not open file \"" << argv[1] << "\"!" << std::endl;
            return 1;
        }
        std::string new_file;
        std::getline(file_in, new_file);
        std::ofstream file_out(new_file.c_str());
        file_in.seekg(0, std::ios::beg);
        file_out << file_in.rdbuf();
        std::clog << "File \"" << new_file << "\" created!" << std::endl;
    }
    

    ...

    edit
    nen " vergessen 😉



  • Danke funktioniert soweit.

    Jedoch werden bei deinem Programm, die Leerzeichen nicht im Dateinamen mit reingeschrieben. Ich habe versucht bei

    std::getline(file_in, new_file);
    

    ein '\n' einzufügen, hat leider nichts gebracht.

    Die Erste Zeile sieht so aus(ohne Zeilenumbruch):
    FIRMA : 01 RMW FEHLERPROTOKOLL AUTOMATISCHE BUCHUNG DTA MIETER DATUM : 23.10.03

    und hat 130 Zeichen inkl. Leerzeichen. Bitte hilf mir nochmal, danke. Gruß, padthink



  • padthink:padthink schrieb:

    Die Erste Zeile sieht so aus(ohne Zeilenumbruch):
    FIRMA : 01 RMW FEHLERPROTOKOLL AUTOMATISCHE BUCHUNG DTA MIETER DATUM : 23.10.03

    Und das soll einen gültigen Dateinamen ergeben? Zumindest bei den Doppelpunkten dürfte Windows sich querstellen.



  • ist mir vorher dann aufgefallen, danke !! ;-).



  • Hallo habe ein ähnliches Problem

    int main(int argc, char *argv[])
    {
            while (in.good())
        {
              ofstream out(argv[1].bak); //hier soll ein Bakup enstehen von der alten datei die nachher überschrieben wird
              do
              {
              getline(in,buffer,'\n');
              out<<buffer<<endl;
    
              if( myZeile.isZuAendern() && !myZeile.functionIsFinished()) 
              {
                  myZeile.appendZeile(buffer);                  
              }
              else
              {
                  vec.push_back( myZeile );
                  myZeile.setZeile( buffer );
              }
              myZeile.setdelSpace();
              }
              while (in.good());
              out.close();
    
        }
    
    }
    

    Bekomme es nicht hin das .bak anzuhängen, hab das array schon in einem String gespeichert plus das bak doch leider nimmet er es oben in der funktion nicht mehr an.
    Danke im voraus

    Gruß Thomas



  • 'argv[1].bak' ist ja auch Käse - du solltest den Dateinamen lieber per String-Konkatenation zusammensetzen:

    string filename = argv[1];
    filename += ".bak";
    ofstream out(filename.c_str());
    

    (wenn du sehr verzweifelt bist, kannst du auch strcat() verwenden)



  • Danke für deine Antwort,
    hab jetzt nur noch das problem das ich argv[1] überprüfen will das es nicht leer ist weil so gibt es immer wieder fehler.



  • Und was ist so schwer daran, argv[1] zu überprüfen?



  • Irgendwie steh ich wohl auf dem Schlauch,
    hab verschiedene möglichkeiten schon getestet

    if(argc <= 1)
    if(argv[1]=="")
    if(argv[1]=='')
    


  • Auf ihnhalt überprüfen geht

    if(temp=="Hilfe"||temp=="hilfe")
        {
           system("cls");
           cout<<"******************** Hilfe ********************"<<endl<<endl;
           return(0);
        }
    

    aber ich will überprüfen ob er leer ist weil sonst stürzt das programm ab wenn ich keinen Parameter übergebe



  • Die Überprüfung von argc sollte eigentlich funktionieren, um die "kein Parameter angegeben" abzufangen. Alternativ kannst du auch argv[1] mit dem NULL-Zeiger vergleichen oder strcmp() darauf loslaufen lassen (solange du noch nackte char* in der Hand hältst, taugt der Vergleichsoperator nicht wirklich).



  • das hab ich auch schon probiert

    if(argv[1]==NULL)
    


  • Hab jetzt folgenden Code

    if(strcmp(argv[1],argv[2])==0)
        {
           cout<<"Bitte dateinamen bei Aufruf des Programms eingeben"<<endl;
           cout<<"Fuer Hilfe bitte Programm mit Parameter \"Hilfe\" aufrufen"<<endl;
           return(0);
        }
    

    müsste ja stimmen weil wenn kein Parameter übergeben wird kann auch der andere parameter nicht vorhanden sein.

    doch leider stellt mein programm immer wieder einen fehler fest und muss beendet werden
    wenn ich parameter übergebe funktioniert das prog.
    hab das Programm mal mit .....exe test test gestartet und es geht in die if schleife rein



  • Wenn du keine Parameter angegeben hast, ist argv[0] der Programmname*, argv[1]==NULL und weitere Elemente nicht definiert (also Datenmüll). Für die Abfrage, ob überhaupt Parameter übergeben wurden, solltest du besser argc auswerten (das liefert die Anzahl der angegebenen Parameter inklusive des Programmnamens).

    * Ehe ich hier den ANSI Standar an den Kopf geworfen bekomme: Genau genommen ist nicht festgelegt, was in argv[0] stehen soll - aber in der Regel ist's der Programmname.



  • ja es ist der Programmname.
    wenn ich es über argc<=1 macht er auch nicht
    wenn ich strcmp(argv[1],argv[2])==0) anwende und nur einen parameter eingebe stürzt das prog ab



  • Tomas schrieb:

    wenn ich es über argc<=1 macht er auch nicht

    Was heißt hier "macht er nicht"? Zeig doch mal etwas Code.

    (und eventuell solltest du dir mal ausgeben lassen, was tatsächlich in argc drinsteht)



  • Hallo
    hab den Fehler endeckt.
    ich weiße bevor ich die überprüfung von argv[1] mach weiße argv[1] einem String zu und deswegen gab es probleme.
    Danke für deine Hilfe


Anmelden zum Antworten