mikrocontroller.net

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


Autor: Mark M. (mom-jovi)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Murkser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Mark M. (mom-jovi)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mark M. (mom-jovi)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael M. (technikus)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Randbemerkung:

Besser ist es, snprintf zu verwenden.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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" );

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.