ich möchte gerne die Berechnungsergebnisse, die ein C-Programm in
diversen Schleifendurchläufen errechnet in separate Dateien ausgeben,
also "1.txt", "2.txt", "3.txt" usw.
Mein Problem liegt darin, dass "fp = fopen(xxx,"w");" gerne const char
hätte, meine Schleifenvariable aber vom Typ int ist. Wenn ich also
(n,"w") eingebe, kriege ich natürlich Mecker vom Compiler. Also denke
ich mal, das muss vorher umgewandelt werden - nur wie? Ausserdem würde
ich noch gerne ein".txt" hinter die Zahlen hängen. Weiss jemand, wie das
geht?
Gruß,
Stephan
Sicher.
char filename[32]; // sollte fuer einfache dateinamen reichen
...
sprintf(filename, "%d.txt", n);
... fopen(filename, "w");
...
HTH
MFG
Volkmar Kostka
du könntest es mit snprintf(..) versuchen.
http://wwwcgi.rdg.ac.uk:8081/cgi-bin/cgiwrap/wsi14/poplog/man/3S/sprintf
> Gruß,
> Stephan
Lothar
--
http://gnu.kldp.org/cb/hacker-howto/the_girls_guide_to_geek_guys.html
> Sicher.
>
> char filename[32]; // sollte fuer einfache dateinamen reichen
> ...
> sprintf(filename, "%d.txt", n);
> ... fopen(filename, "w");
> ...
>
> HTH
>
> MFG
>
> Volkmar Kostka
Danke sehr.
Gruß,
Stephan
> Stephan Aspridis <s.asp...@t-online.de> writes:
>
>>Mein Problem liegt darin, dass "fp = fopen(xxx,"w");" gerne const char
>>hätte, meine Schleifenvariable aber vom Typ int ist. Wenn ich also
>>(n,"w") eingebe, kriege ich natürlich Mecker vom Compiler. Also denke
>>ich mal, das muss vorher umgewandelt werden - nur wie?
>
> Das folgende Programmbeispiel zeigt, wie eine Zahl in
> einen Text gewandelt werden kann.
>
> #include <stdio.h> /* printf */
> #include "salloc.h" /* s_type, salloc, sfree */
>
> int main( void )
> { s_type const r = salloc( "%d", 2 );
> if( r ){ printf( "r = \"%s\"\n", r ); sfree( r ); }}
Das Programmbeispiel zeigt vor allem, dass Du immer noch nicht gelernt
hast, menschenlesbaren C-Code zu produzieren.
> Das folgende h-c-Paar wurde dabei verwendet:
Und das zeigt, dass Du das Problem des Posters nicht verstanden hast.
Wann hörst Du endlich auf, Deine vermeintliche Fachkompetenz durch
umfangreiche, nichtssagende, unleserliche, mangelhaft bis gar nicht
kommentierte und am Thema meilenweit vorbei zielende Mammutpostings zu
demonstrieren, anstatt Dich auf die Kernprobleme der Fragensteller zu
konzentrieren?
Gruß. Claus
>
> char filename[32]; // sollte fuer einfache dateinamen reichen
> ...
> sprintf(filename, "%d.txt", n);
Besser ist:
snprintf(filename,sizeof(filename),"%d.txt", n);
um den möglichen Buffer-Overflows zu vermeiden.
Auch wenn es hier übersichtlich erscheint ist die
vsnprintf() Variante immer vorzuziehen.
Dann kann man auch mal aus "%d.txt" einfach
"ein-nettes-kleines-unterverzeichnis/Datei-%08d.txt"
machen, ohne das es gleich zu einem Buffer-Overflows kommt.
Lemmi
--
mailto: d...@18xx.de
homepage: http://www.18xx.de
a) filename[1024];
b) sprintf(filename, "%.100s%d%.20s", "", n, ".txt");
--
Mit freundlichen Grüßen
Helmut Schellong v...@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
> b) sprintf(filename, "%.100s%d%.20s", "", n, ".txt");
b) Was willst Du denn damit ausdrücken?
"%d.txt" kann niemals mehr als 25 Zeichen ergeben.
Die Lösung mit filename[32] war also bereits sicher, da der
Zeichenbedarf als Konstante vorliegt.
filename[1024] ist noch viel sicherer, da eventuelle spätere
Veränderungen in der Quelle pauschal berücksichtigt wurden.
Man beachte, daß in diesem Fall der Dateiname nicht von außen
in unbekannter Länge zugeführt wird.
>>b) sprintf(filename, "%.100s%d%.20s", "", n, ".txt");
>
> b) Was willst Du denn damit ausdrücken?
Daß die ANSI-sprintf bereits eine Längenbegrenzung eingebaut hat,
die auch per Argument (.*) vorgenommen werden kann.
Daß die Konstanten (z.B. ".txt") jederzeit ersetzt werden können.
>
>
> "%d.txt" kann niemals mehr als 25 Zeichen ergeben.
> Die Lösung mit filename[32] war also bereits sicher, da der
> Zeichenbedarf als Konstante vorliegt.
>
und mehr ist auch nicht nötig, da die Umlaufvariable "n" wohl eher
selten den Wert einer 22stelligen Zahl annehmen wird... ;-)
Gruß,
Stephan
>
> Dann kann man auch mal aus "%d.txt" einfach
> "ein-nettes-kleines-unterverzeichnis/Datei-%08d.txt"
> machen, ohne das es gleich zu einem Buffer-Overflows kommt.
>
Das ist doch ein slash (/) da oben, oder? Was meint denn z.B. die
Windows-Welt dazu? Soll ja nicht nur für Unix sein.
Gruß,
Stephan
Das funktioniert dort genauso. Der Slash hat sogar schon unter DOS
funktioniert.
Gruss
Uz
--
Ullrich von Bassewitz u...@spamtrap.musoftware.de
21:37:16 up 23:33, 11 users, load average: 0.01, 0.06, 0.02
> Dirk Clemens wrote:
>
>> "ein-nettes-kleines-unterverzeichnis/Datei-%08d.txt"
>
> Das ist doch ein slash (/) da oben, oder? Was meint denn z.B. die
> Windows-Welt dazu?
Die kann damit umgehen.
Gruß. Claus
>> Dann kann man auch mal aus "%d.txt" einfach
>> "ein-nettes-kleines-unterverzeichnis/Datei-%08d.txt"
>> machen, ohne das es gleich zu einem Buffer-Overflows kommt.
SA> Das ist doch ein slash (/) da oben, oder? Was meint denn z.B. die
SA> Windows-Welt dazu? Soll ja nicht nur f?r Unix sein.
seit DOS 5 ist die DOS/Windowswelt auf beide Sorten Slashes in
Pfad-/Filenamen eingerichtet. Nur auf der Kommandozeile gilt "/" als
Options-Einleitung
freundliche Gruesse
Fr...@dpk.berlin.fido.de
> Dirk Clemens wrote:
>
>> Helmut Schellong wrote:
>>
>>>....
>>> a) filename[1024];
>>
>>
>> a) Löst das Problem nicht, sondern verschiebt nur die Grenze.
>
> "%d.txt" kann niemals mehr als 25 Zeichen ergeben.
> Die Lösung mit filename[32] war also bereits sicher, da der
> Zeichenbedarf als Konstante vorliegt.
1)
meinen Kommentar wohl nicht gelesen.
2)
Sowas habe schon viele Programmierer gedacht ...
... und jetzt stehe wir vor den Scherbenhaufen names 'Buffer-Overflow'
Daher ist wenn, wenn möglich, snprintf() vorzuziehen.
Es tut nicht weh und sichert die Implementierung zusätzlich ab.