an sich, ja
Moin,
Angenommen ich möchte über ein C-Programm den Inhalt einer
Text-Datei drucken: Ist es nötig, dass ich über fscanf den
Inhalt der Datei auslese und in einem String
zwischenspeichere, bevor ich die Ausgabe über fprintf an den
Drucker schicken kann, oder gibt es auch eine Lösung, bei der
ich keine Variable benutzen muss? Also eine Art "direkten
Weg".
Das direkteste, was ich mir vorstellen kann, ist eine Funktion „openFile()“, die eine
Datei oeffnet, einen char* zurueck gibt, und schliesst sie wieder. Die kannste dann bei fprintf() als Quelle angeben, ohne extra Speicher, also:
FILE \* fp = 0;
fp = fopen("schreiben.txt", "at");
if (!fp) { /\*\*/ }
fprintf (fp, "%s", openFile("lesen.txt", "rt"));
fclose(fp);
Wie lange die geoeffnete Datei ist, das wird der dann schon merken. Deine Funktion sollte halt ein ‚\0‘ anhaengen - kriegst Du das hin?
Ich weiß ja schließlich nicht im Vorraus, wie groß die
Datei ist und ob der String-Array groß genug ist bzw. wie groß
ich ihn anlegen muss ?! Die Zeichen ließen sich natürlich
Zählen, aber dazu müsste man sie dann erst mal über printf auf
dem Bildschirm ausgeben, nicht wahr?
Muss man gar nicht. Du kannst die eizelnen Zeichen mit fgetc() abrattern lassen, die Ausgabe am Bildschirm wuerde das ganze nur einbremsen:
// geoeffnet ist sie....
long i;
char ch = 32;
for (i=0; ch != EOF; i++)
{
ch = fgetc(fp);
}
long groessenMerker = i;
dann musste halt das Datei-Caret mit fseek() wieder an den Anfang setzen, oder schliessen und neu oeffnen.
Gucke doch mal hier rein, da findest Du schlicht alles zum Thema „FILE *“:
http://www.cplusplus.com/ref/cstdio/fgetc.html
Aber Du kannst die Groesse (auf windows API) auch billiger kriegen:
ULONG getFileSize(const char \*path)
{
WIN32\_FIND\_DATAA wfd;
wfd.nFileSizeLow = 0;
HANDLE hFind = INVALID\_HANDLE\_VALUE;
hFind = FindFirstFile(path, &wfd);
if (hFind == INVALID\_HANDLE\_VALUE) { return 0; }
return wfd.nFileSizeLow;
}
thx
moe.
plz
lg
Martin