Dateinamen mit Präfix nummerieren in C

#1977153
Lesenswert?

Hallo,
ich möchte mehrere Textfiles erstellen, die alle dasselbe Präfix haben 
und eine angehängte fortlaufende Nummerierung. Warum funktioniert das 
Folgende nicht?

Ich habe mir überlegt, zunächst 3 getrennte Strings anzulegen:

char* endung={".txt"};
char* praefix={"text"};
char* nummer={"0"};

Jetzt hänge ich die mit strcat aneinander und übergebe den Gesamtstring 
der Funktion fopen als Dateinamen.

--> FRAGE: Geht das überhaupt? Kann ich fopen einen solchen String 
übergeben, oder muss er ausgeschrieben (hartcodiert) werden?

Anschließend wollte ich für fortlaufende Nummern den String nummer 
"hochzählen", indem ich ihn als Array sehe und das nullte Element (was 
ja char ist) hochzähle:

nummer[0]++;

Aber das scheint nicht zu funktionieren, ich wollte es mir zur Kontrolle 
folgendermaßen anzeigen lassen:

1    printf("%s\n",nummer);     // gibt "0" aus
2    printf("%c\n",nummer[0]);  // gibt "0" aus
3    nummer[0]++;               // scheint nicht zu funktionieren
4    printf("%s\n",nummer);     // Zeilen 4 und 5 werden scheinbar igno-
5    printf("%c\n",nummer[0]);  // riert, es ist keine Anzeige zu sehen.

mit nummer[0]=nummmer[0]+1 in Zeile 3 geht's übrigens auch nicht.

WARUM?
#1977179
Lesenswert?

Murkser schrieb:
> Schau Dir mal in einer ASCII Tabelle an, welches Zeichen nach "0" kommt.

Aber die 0 ist hier doch der Character '0', also 0x30?!
In Anbetracht dessen, dass nummer ein string ist, wäre das doch auch 
logisch. Dann kommt beim Hochzählen 0x31 und damit das Zeichen '1'.
Oder wird ein String "65" bei zeichenweiser Ausgabe (als Array) auch als 
A ausgegeben? Woher wüsste der Compiler dann, das ich EINE 65 meine und 
nicht EINE 6 und EINE 5 ?

Rufus Τ. Firefly schrieb:
> Das ist nicht das Problem, das auf "0" folgende Zeichen ist "1".

Genau ;)
Persönliche Seite #1977183
Lesenswert?

Mark M. schrieb:
> Aber die 0 ist hier doch der Character '0', also 0x30?!
> In Anbetracht dessen, dass nummer ein string ist, wäre das doch auch
> logisch. Dann kommt beim Hochzählen 0x31 und damit das Zeichen '1'.

So ist es.

Mark M. schrieb:
> Oder wird ein String "65" bei zeichenweiser Ausgabe (als Array) auch als
> A ausgegeben? Woher wüsste der Compiler dann, das ich EINE 65 meine und
> nicht EINE 6 und EINE 5 ?

Nein.

Worauf lässt Du Dein Programm laufen? In was für einem Speicherbereich 
werden Stringkonstanten Deines Programmes abgelegt? Und warum habe ich 
das Wort Stringkonstanten kursiv geschrieben?
#1977192
Lesenswert?

Ok, Stringkonstanten können nicht verändert werden? Aber wieso wird dann 
garnichts angezeigt und das Programm ab der Veränderung, die nicht 
möglich ist, komplett ignoriert, ohne Fehlermeldung?

Es ist ein einfaches Konsolenprogramm mit GNU GCC Compiler.

Ist die Veränderung der Stringkonstanten auch nicht mit Indexansprache 
möglich?
Persönliche Seite #1977206
Lesenswert?

Mark M. schrieb:
> Ok, Stringkonstanten können nicht verändert werden?

Das kann so sein, muss aber nicht. Hängt vom Zielsystem und dem 
verwendeten Compiler ab.

> Aber wieso wird dann garnichts angezeigt und das Programm ab
> der Veränderung, die nicht möglich ist, komplett ignoriert,
> ohne Fehlermeldung?

Das wird Dir nur Dein Debugger verraten können, in dem Du Dein Programm 
mal laufen lassen solltest.
#1977210
Lesenswert?

Mal eine ganz andere Frage: Warum muß es denn unbedingt mit Rumrechnen 
der ASCII-Werte sein? Wäre sprintf hier nicht deutlich einfacher? Mit 
festem Präfix und Erweiterung:

int nummer;
sprintf(output_string, "text%d.txt", nummer);

Oder wenn Präfix und Endung sich ändern:
sprintf(output_string, "%s%d%s", praefix, nummer, endung);

Servus
Michael
#1977303
Lesenswert?

Mark M. schrieb:
> Ok, Stringkonstanten können nicht verändert werden? Aber wieso wird dann
> garnichts angezeigt und das Programm ab der Veränderung, die nicht
> möglich ist, komplett ignoriert, ohne Fehlermeldung?

Das Verhalten ist undefiniert. Das von dir beobachtete Ergebnis ist eine 
Ausprägung davon.

> Ist die Veränderung der Stringkonstanten auch nicht mit Indexansprache
> möglich?

Ob nun mit Index oder ohne - eine Konstante darf man nicht ändern, sonst 
wäre es ja keine Konstante.

Rufus Τ. Firefly schrieb:
> Mark M. schrieb:
>> Ok, Stringkonstanten können nicht verändert werden?
>
> Das kann so sein, muss aber nicht. Hängt vom Zielsystem und dem
> verwendeten Compiler ab.

Die bessere Formulierung wäre vielleicht, daß Strinkonstanten nicht 
verändert werden dürfen. Je nach Compiler kann man nämlich das Pech 
haben, daß es tatsächlich zu funktionieren scheint.
#1977402
Lesenswert?

Mark M. schrieb:
> char* endung={".txt"};
>
> char* praefix={"text"};
>
> char* nummer={"0"};

Mark M. schrieb:
> 3    nummer[0]++;               // scheint nicht zu funktionieren


so wird was draus:

char endung[] = {".txt"};
char praefix[] = {"text"};
char nummer[] = {"0"};

nummer[0]++;               // funktioniert


Mark M. schrieb:
> 4    printf("%s\n",nummer);     // Zeilen 4 und 5 werden scheinbar igno-
>
> 5    printf("%c\n",nummer[0]);  // riert, es ist keine Anzeige zu sehen.

die Zeilen 4 und 5 werden nicht ignoriert, sondern das Programm stürzt 
in Zeile 3 ab (Access violation).

mfg.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren