Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

primitiver dateizugriff in c

the brain / 6 Antworten / Baumansicht Nickles

zeawus
ich will in meinem programm aus einer textdatei worte auslesen,
und sie als variablen(char) ganz normal weiterverarbeiten.
das proggi schaut jetzt so aus, was muss i ändern
#include "stdio.h"

main()
{
int c;
FILE *fp;

fp = fopen("/usr/local/bin/stp/input","r");
while (c != EOF){
c = getc(fp);
putc(c, stdout);
}
fclose(fp);
}

wie kann ich den output der datei in eine variable schreiben?

bei Antwort benachrichtigen
thomas woelfer the brain „primitiver dateizugriff in c“
Optionen

tja, ich vermute mal das du eigentlich den kompletten inhalt der datei lesen willst. da gibt es verschiedene moeglichkeiten. der einfachste weg waere die groesse der datei in byte festzustellen und dann entsprechend viel speicher zu allozieren. dann kannst du die gelesenen zeichen in diesem speicher ablegen...

WM_HOPETHISHELPS
thomas woelfer

this posting contains no tpyos.
bei Antwort benachrichtigen
the brain Nachtrag zu: „primitiver dateizugriff in c“
Optionen

hä?
da komm ich jetzt nit ganz mit, ich will eigendlich nur den inhalt einer ascii-datei in eine char variable schreiben, um das dann ganz normal weiter zu bearbeiten.
muss ich das jetzt mit getc() machen und den output von stdout in die char variable umleiten, oder gibts da eine andere funktion, die diese aufgabe wewältigt?
danke für alle antworten
MFG the brain

bei Antwort benachrichtigen
thomas woelfer the brain „hä? da komm ich jetzt nit ganz mit, ich will eigendlich nur den inhalt einer...“
Optionen

du _kannst_ den inhalt einer ascii datei nicht in einer variable vom typ char ablegen. eine variable vom typ 'char' kann genau _ein_ zeichen aufnehmen.

was du also brauchst ist ein speicherbereich der die datei auch aufnehmen kann. wieviel speicher du brauchst ist also von der groeser der datei abhaengig.

das bedeutet, du musst erst die dateigroesse ermitteln. dann must du speicher allozieren. die adresse des anfanges des allozierten blockes merkst du dir in einer char* variablen.

dann kannst du die datei in diesen block einlesen. das geht z.b. mit einem einzigen aufruf von fread().

danach kannst du mit dem speicherbereich machen was immer du willst.

z.b. (in c, unter win32):

DWORD dwFileSize;
char* pBuffer;
FILE* pStream;
dwFileSize = GetFileSize( hFile, NULL);
pBuffer = (char*)malloc( dwFileSize * sizeof(char));
pStream = fopen( "Name", "r");
fread( pBuffer, sizeof(char), dwFileSize, pStream);
fclose( pStream);

WM_HOPETHISHELPS
thomas woelfer

[Diese Nachricht wurde nachträglich bearbeitet.]

this posting contains no tpyos.
bei Antwort benachrichtigen
the brain Nachtrag zu: „primitiver dateizugriff in c“
Optionen

danke!
funzt das unter linux auch, oder muss ich da was ändern?
the brain

bei Antwort benachrichtigen
the brain Nachtrag zu: „primitiver dateizugriff in c“
Optionen

ich hab des jetzt mal compilliert, aber kriege nur fehlermeldungen:
test.c: In function `main':
test.c:3: `DWORD' undeclared (first use in this function)
test.c:3: (Each undeclared identifier is reported only once
test.c:3: for each function it appears in.)
test.c:3: parse error before `dwFileSize'
test.c:5: `FILE' undeclared (first use in this function)
test.c:5: `pStream' undeclared (first use in this function)
test.c:6: `dwFileSize' undeclared (first use in this function)
test.c:6: `hFile' undeclared (first use in this function)
test.c:6: `NULL' undeclared (first use in this function)

was daran ändern?

was ich nicht ganz versteh:

dwFileSize = GetFileSize( hFile, NULL);
was ist hFile, bzw woher kommt die variable, ist das eine vordefinierte(kann irgendwie nicht sein, weil man ja auch das file angeben muss, dessen grösse man wissen will)?

PS:
>eine variable vom typ 'char' kann genau _ein_ zeichen aufnehmen.
natürlich meinte ich einen zeichenvektor, tschuldige

MFG the brain

bei Antwort benachrichtigen
the brain Nachtrag zu: „ich hab des jetzt mal compilliert, aber kriege nur fehlermeldungen: test.c: In...“
Optionen

tschuldige alle fehler in zeile 3 passieren, weil ich vergessen habe stdio.h zu includieren!

bei Antwort benachrichtigen