PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c]ganzen text datei in einlesen



Celuldor
03-03-2007, 09:20
versuche autodidaktisch c zu lernen
und ich weiss nicht wo mein denkfehler ist

ich versuche den ganzen text einer datei einzulesen und in eine variabele(kann auch array sein :-) ) zu laden

erste versuche haben mir immer nur lange zahlenfolgen ausgegeben :-(

nu hab ich was das TEXT ausgibt / leider aber nur das erste wort
alle was nach dem ersten leerzeichen kommt ,btw nach nem zeilenumbruch, ist einfach weg

meine textdatei:

test1 test1,2
test2

meine gewünschte ausgabe währe im prinzip identisch
sieht aber nur so aus :

test1

hier das was ich dazu aus den tutorials heraus zusammengebastelt hab

FILE *Quelle;
char s[81];
char fname[] = "test.txt";

Quelle = fopen(fname,"rt");
if (Quelle == NULL)
print("\n\nFehler : Konfigurations-Datei nicht Gefunden!\n");
else
{ /*fseek( Quelle, 0L, SEEK_SET );*/
fscanf( Quelle, "%s", s );
printf( "%s", s );
#define INFOTEXT s
fclose(Quelle);
}

mit dem:


FILE *fz;
char buffer[512];

fz=fopen("test.txt", "r");
while(fgets(buffer, 512, fz))
{
printf("%s", buffer);
#define INFOTEXT buffer
}

bekomme ich zwar in der ausgabe alles
in der vari steht aber nur die letzte zeile :-(

wenn jemand licht in meine geistige dunkelheit bringen könnte währe ich sehr dankbar :-)

nul
03-03-2007, 10:24
FILE *fz;
int i;
char buffer[512];

fz=fopen("test.txt", "r");
i=1;
while(fgets(buffer, 512, fz))
{
if(i%1==0) printf("%s", buffer);
i++;
#define INFOTEXT buffer
}

das ist schon ein recht guter ansatz, wobei ich aber jetzt selbst nicht verstehe warum du in der Schleife etwas definierst, und das bei jedem Durchlauf???

Dir fehlt hier ein zusaetzlicher Buffer, in dem du alles, was du gelesen hast, ablegst. D.h., ein zusaetzlicher Buffer (achtung, der muss bei grossen Texten auch gross genug sein, [realloc/calloc/malloc]) in dem du entweder mit strncat oder snprintf den Text hienten dranhaengst.

P.S. Gewoehn dir gleich an die Funktionen mit *n* zu benutzen, aus Sicherheietsgruenden. Ausserdem kann man sich so viele Probleme vom Hals schaffen.

Celuldor
03-03-2007, 11:03
meintest du es so in etwa ?

FILE *fz;
int i;
char buffer[256];
char buffer2[512];

fz=fopen("test.txt", "r");
i=1;
while(fgets(buffer, 256, fz))
{
if(i%1==0) printf( "%s", buffer);
if(i%1==0) snprintf(buffer2, 512, "%s", buffer);
i++;
}
#define INFOTEXT buffer2

ändert am ergebniss nix :-(

nul
03-03-2007, 11:35
So in etwa, aber du verwendest snprintf nicht ganz richtig.
snprintf kann man mehrere Parameter angeben, soviele, wie im Formatierungsstring vorhanden sind. Bei dir enthaelt der Formatierungsstring nur eine Zeichenkette ("%s") und als Parameter auch nur den buffer.
Ein Beispiel wies richtig geht findest du hier: http://libslack.org/manpages/snprintf.3.html

Aber ich glaube dass strncat fuer dich besser geeignet waere, schliesslich musst du keinen Text formatieren sondern nur zusammenfuegen.

mfg

P.S. Kannst du mir erklaeren, wieso du jetzt aufeinmal ein #define INFOTEXT buffer2 verwendest?
Wenn ich mit meiner Ueberlegung recht habe, dann ist das ein ziemlich schlechter Programmierstil!

Celuldor
03-03-2007, 12:03
ich möchte mit dem ganzen hier eine variabele/array mit dem namen INFOTEXT
mit dem kompletten inhalt der textdatei füllen

um diesen inhalt später weiterzuverarbeiten/in ein GTK_TEXT_VIEW anzuzeigen

gut möglich das ich hier mehrere denkfehler gemacht hab :-) (bin noch beim lernen^^)

Celuldor
03-03-2007, 18:50
hab da mit grosser hilfe eines bekannten was zusammen gebastelt bekommen (funst zwar ist aber leicht buggy weil ja ein array übergeben wird und das irgendwie nicht so gut funst ?)



int config_load(int INPUT)
{ FILE *ptrFile;
char strFileToRead[] = "test.txt";
long lSize;
char *ptrStrBuffer;

ptrFile = fopen (strFileToRead,"rb");

if (ptrFile == NULL)
{
printf("File error");
return (1);
}

fseek (ptrFile,0,SEEK_END);
lSize = ftell(ptrFile);
rewind (ptrFile);


ptrStrBuffer = (char*)malloc(sizeof(char)*lSize);

fread (ptrStrBuffer,1,lSize,ptrFile);

printf("%s",ptrStrBuffer);
fclose (ptrFile);

return ptrStrBuffer;
}