Forum: PC-Programmierung Dateinamen mit Präfix nummerieren in C


von Mark M. (mom-jovi)


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?

von Murkser (Gast)


Lesenswert?

Schau Dir mal in einer ASCII Tabelle an, welches Zeichen nach "0" kommt. 
Vielleicht kommst Du dann ja selbst darauf, was da nicht stimmt.

Murkser

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Murkser schrieb:
> Schau Dir mal in einer ASCII Tabelle an, welches Zeichen nach "0" kommt.
> Vielleicht kommst Du dann ja selbst darauf, was da nicht stimmt.

Das ist nicht das Problem, das auf "0" folgende Zeichen ist "1".

von Mark M. (mom-jovi)


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 ;)

von Rufus Τ. F. (rufus) Benutzerseite


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?

von Mark M. (mom-jovi)


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?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Michael M. (technikus)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Randbemerkung:

Besser ist es, snprintf zu verwenden.

von Rolf M. (rmagnus)


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.

von Karl H. (kbuchegg)


Lesenswert?

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 ?


Und um das auch noch zu beantworten.
Was wohl ist der UNterschied in

  printf( "%d", 65 );
  printf( "%c", 65 );
  printf( "%s", "65" );

von Thomas E. (thomase)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.