Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Dateiausgabe in Schleife?

6 views
Skip to first unread message

Stephan Aspridis

unread,
Dec 15, 2003, 7:50:07 PM12/15/03
to
Hallo,

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

Kostka, Volkmar

unread,
Dec 15, 2003, 8:00:28 PM12/15/03
to

Hallo,

Sicher.

char filename[32]; // sollte fuer einfache dateinamen reichen
...
sprintf(filename, "%d.txt", n);
... fopen(filename, "w");
...

HTH

MFG

Volkmar Kostka

Lothar Dierkes

unread,
Dec 15, 2003, 7:55:22 PM12/15/03
to
Stephan Aspridis wrote:
> 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?

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

Stephan Aspridis

unread,
Dec 15, 2003, 8:48:20 PM12/15/03
to
Kostka, Volkmar wrote:

> 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

Claus Reibenstein

unread,
Dec 16, 2003, 1:43:43 AM12/16/03
to
Stefan Ram schrieb:

> 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

Dirk Clemens

unread,
Dec 16, 2003, 6:18:10 AM12/16/03
to
Kostka, Volkmar wrote:

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


Helmut Schellong

unread,
Dec 16, 2003, 10:03:43 AM12/16/03
to
Dirk Clemens wrote:
> Kostka, Volkmar wrote:
>
>
>>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.

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

Dirk Clemens

unread,
Dec 16, 2003, 10:36:58 AM12/16/03
to
Helmut Schellong wrote:
> Dirk Clemens wrote:
>
>> Kostka, Volkmar wrote:
>>
>>
>>> 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.
>
>
> a) filename[1024];
a) Löst das Problem nicht, sondern verschiebt nur die Grenze.

> b) sprintf(filename, "%.100s%d%.20s", "", n, ".txt");

b) Was willst Du denn damit ausdrücken?

Helmut Schellong

unread,
Dec 16, 2003, 10:57:50 AM12/16/03
to
Dirk Clemens wrote:
> Helmut Schellong wrote:
>
>>Dirk Clemens wrote:
>>
>>
>>>Kostka, Volkmar wrote:
>>>
>>>
>>>
>>>>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.
>>
>>
>>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.

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.

Stephan Aspridis

unread,
Dec 16, 2003, 11:39:28 AM12/16/03
to
Helmut Schellong wrote:

>
>
> "%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

Stephan Aspridis

unread,
Dec 16, 2003, 11:40:44 AM12/16/03
to
Dirk Clemens wrote:

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

Ullrich von Bassewitz

unread,
Dec 16, 2003, 3:39:22 PM12/16/03
to
Stephan Aspridis <s.asp...@t-online.de> wrote:
> Das ist doch ein slash (/) da oben, oder? Was meint denn z.B. die
> Windows-Welt dazu?

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

Claus Reibenstein

unread,
Dec 16, 2003, 1:03:37 PM12/16/03
to
Stephan Aspridis schrieb:

> 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

Franz Zimmer

unread,
Dec 16, 2003, 5:43:46 PM12/16/03
to
Hi 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.

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

unread,
Dec 17, 2003, 12:07:46 PM12/17/03
to
Helmut Schellong wrote:

> 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.

0 new messages