Anzeige:
Ergebnis 1 bis 8 von 8

Thema: OutFile wie InFile, jedoch andere Endung

  1. #1
    Registrierter Benutzer Avatar von againsttcpa
    Registriert seit
    21.03.2003
    Ort
    Am Oberlauf der Weser
    Beiträge
    52

    OutFile wie InFile, jedoch andere Endung

    Vorweg: Ich habe nicht viel Ahnung von C, also bitte nicht gleich erschlagen.

    Hier mein Problem

    Ich übergebe einen Dateinamen [inputFilename] als Argument an das Programm. Nun möchte ich, daß [outputFilename] genauso lautet, jedoch eine andere Dateiendung hat.
    Wie muß ich das in C (++) bewerkstelligen?

    Sven
    Mandrake 9.1, Kernel 2.4.21, XFree 4.3.0, KDE 3, Kylix 3,
    PIII/500, 256MB, 12+3GB, Modem 56K intern

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486

    Re: OutFile wie InFile, jedoch andere Endung

    Original geschrieben von againsttcpa

    Wie muß ich das in C (++) bewerkstelligen?
    In C++ vielleicht so
    Code:
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main(int args,char *argv[])
    {
    	string str = argv[1];
    	string::size_type pos;
    	if((pos = str.find_last_of(".")) != string::npos)
    		str.replace(pos,str.size() - pos,".txt");
    
    	cout << str << endl;
    }

  3. #3
    Registrierter Benutzer Avatar von Boron
    Registriert seit
    07.01.2002
    Beiträge
    827
    Code:
    int main( int argc, char* argv[])
    {
        /* dein Code */
        return 0;
    }
    "argc" ist die Anzahl aller Argumente deines Programms.
    Das erste Argument ist immer absoluter Pfad und Ausführbare Datei.
    Wenn du dein Programm also mit "prog gaga" startest hast du argc==2.

    argv ist ein Array von Strings, die die einzelnen Argumente beinhalten.
    Im Beispiel ist das Feld also zwei Einträge groß:
    argv[0] hat dann also z.B. den Inhalt "/usr/bin/prog"
    argv[1] hat den Inhalt "gaga"


    So funktioniert das mit Argumenten/Optionen für Programme in C/C++.
    Wie du das intern dann verarbeitest liegt an dir.
    Gruß Boron (der sich oft wegen mieser Rechtschreibung anderer die Augen reiben muss)

    LINUX IS LIKE AN INDIAN TENT: NO GATES, NO WINDOWS AND AN APACHE INSIDE!
    Hardware Monitoring unter Linux -> http://santafu.sourceforge.net (Temperaturen, Lüfterdrehzahlen und Spannungen)

  4. #4
    Registrierter Benutzer Avatar von againsttcpa
    Registriert seit
    21.03.2003
    Ort
    Am Oberlauf der Weser
    Beiträge
    52
    Original geschrieben von Boron
    ...
    "argc" ist die Anzahl aller Argumente deines Programms.
    Das erste Argument ist immer absoluter Pfad und Ausführbare Datei.
    Wenn du dein Programm also mit "prog gaga" startest hast du argc==2.
    ...
    So funktioniert das mit Argumenten/Optionen für Programme in C/C++.
    Wie du das intern dann verarbeitest liegt an dir.
    Danke das habe ich als Super-Laie auch noch gerade gewußt, aber es war absolut nicht meine Frage.
    Mandrake 9.1, Kernel 2.4.21, XFree 4.3.0, KDE 3, Kylix 3,
    PIII/500, 256MB, 12+3GB, Modem 56K intern

  5. #5
    Registrierter Benutzer Avatar von Boron
    Registriert seit
    07.01.2002
    Beiträge
    827
    Entschuldigung.
    Dann habe ich halt deinen ersten Beitrag falsch interpretiert und das Hauptproblem in der Argumentauswertung gesehen .
    Gruß Boron (der sich oft wegen mieser Rechtschreibung anderer die Augen reiben muss)

    LINUX IS LIKE AN INDIAN TENT: NO GATES, NO WINDOWS AND AN APACHE INSIDE!
    Hardware Monitoring unter Linux -> http://santafu.sourceforge.net (Temperaturen, Lüfterdrehzahlen und Spannungen)

  6. #6
    Registrierter Benutzer
    Registriert seit
    11.06.2003
    Beiträge
    15
    Witzig, ich habe ein ganz ähnliches Problem. Meine Lösung - entstanden durch "kreativen" Umgang mit einem Tutorial -- in C (bzw. GTK) sieht bisher so aus:

    Code:
    /* Datei-Extension löschen */
    
    #include <stdio.h>
    #include <string.h>
    #include <gtk/gtk.h>
    
    int main(void)
    {
    	gchar *loc;
    	gchar *basic_string;
    	gchar *old_string = "Eine.weitere.Datei.tex";
    	gsize n;
    
    	/* Suchen und kopieren */
    
    	loc = g_strrstr(old_string, ".");
    
    	n = (gsize)(loc-old_string);
    
    	basic_string = g_strndup(old_string, n);
    	
    	/* Ergebnisse. */
    	if ( loc == NULL ) {
    		printf("Das Zeichen . wurde nicht gefunden.\n");
    	} else {
    		printf("Das Zeichen . wurde an der Position %d gefunden.\n", n);
    		printf("Der alte String lautet: %s\n", old_string);
    		printf("Der neue String lautet: %s\n", basic_string);
    		g_free(basic_string);
    	}
    	
    	return(0);
    }
    Meine zentrale Frage ist aber eigentlich: Geht das noch kürzer - sprich: kann man die drei Zuweisungen in der Mitte noch weiter reduzieren? Und vor allem: Woher kommt die Bezeichnung "loc-old_string"?

  7. #7
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von claus_s
    Und vor allem: Woher kommt die Bezeichnung "loc-old_string"?
    Das ist keine Bezeichnung,denn - ist in Bezeichnern nicht erlaubt.
    Es handelt sich hier um eine Zeigersubstraktion von loc und old_string.
    loc zeigt auf das letzte Auftreten von . im string old_string,und old_string auf den Anfang des strings old_string.
    Durch die Zeigersubtraktion bekommst du die Länge (Anzahl Zeichen),des Strings ohne Extension

    Geht das kürzer?
    Ja,wenn man den String nicht kopiert,und old_string auf einen Speicherbereich zeigt,der beschreibbar ist.
    Code:
    char str[] = "eine.datei.exe";
    char *p;
    if(p = strrchr(str,'.'))
        *p = '\0';
    Btw. wenn dieser QC 1zu1 aus einem Tutorial stammt,würde ich stark darüber nachdenken das Tutorial zu wechseln.

  8. #8
    Registrierter Benutzer
    Registriert seit
    11.06.2003
    Beiträge
    15
    Original geschrieben von wraith
    Das ist keine Bezeichnung,denn - ist in Bezeichnern nicht erlaubt.
    Es handelt sich hier um eine Zeigersubstraktion von loc und old_string.
    Oh, kein Wunder, daß ich mich totgesucht habe! Da saß der Fehler wohl wieder mal vorm Computer.

    Btw. wenn dieser QC 1zu1 aus einem Tutorial stammt,würde ich stark darüber nachdenken das Tutorial zu wechseln. [/B]
    Nein, wie gesagt, es war mein Umgang damit. Die ursprüngliche Version sollte nur den Einsatz von strchr verdeutlichen und ich habe das nur für meine Zwecke umgewandelt ("Learning by doing" ).

    Die Möglichkeit, den String zu kopieren (scheint mir sicherer, da ich ihn noch zum Speichern etc. brauche) und dann direkt abzuändern, ist auch sehr hilfreich. Dann könnte ich "exe\0" ja gleich durch beispielsweise "foo\0" überschrieben, oder?

    Vielen Dank für Deine Antwort.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •