"We are back" « oc.at

wortweises einlesen in c (von *file)

someoneoutthere 10.12.2002 - 13:16 4221 9
Posts

someoneoutthere

Bloody Newbie
Avatar
Registered: Jun 2002
Location: 1040
Posts: 43
peace;)

muss von einem textfile, das ich bereits geöffnet habe, ein wort einlesen, das bearbeiten, dann das nächste wort einlesen, etc.

wie lese ich jetzt wortweise ein? fscanf darf ich nicht verwenden (damit hatte ich es schon gelöst). ... theoretisch is klar: zeichen einlesen bis leerzeichen (oder \t oder \n) kommt, dann ist ein wort vollständig.

aber warum geht das bei mir nicht... irgendwo hab ich fehler. könntet ihr vielleich codevorschläge posten?

thx

xdfk

pädagogisch wertvoll
Avatar
Registered: Sep 2000
Location: Graz
Posts: 6441
poste deinen fehlerhaften code... ich hab erst vor kurzem so einen stringparser gecoded.

someoneoutthere

Bloody Newbie
Avatar
Registered: Jun 2002
Location: 1040
Posts: 43
so circa,.. aber ich bastle im moment ständig dran rum ;(

int done = 0;
int i = 0;
char word[MAX_LENGTH];
char c;

c=fgetc(fin);
while (c!= ' ')
{
word[i++] = c;
c=fgetc(fin);
}

xdfk

pädagogisch wertvoll
Avatar
Registered: Sep 2000
Location: Graz
Posts: 6441
int loop=0;
int space=0;
char *text = malloc((MAX_LENGTH+1)*sizeof(char));
char *just_one_word;
text="just another test temp text";

----hier noch große schleifer herum wür eben die ganze eingabe--
for (loop=0;isspace(text[loop]);loop++);
just_one_word = malloc((loop-space+1)*sizeof(char));
strncopy(just_one_word,&text[space],loop-space);
jetzt das einzelne wort in just_one_word verarbeiten
danach
free (just_one_word); //oder auch gleich nur einmal speicher reservieren in dem aber alle wörter platz haben müssen
//leerzeichen usw musst du noch korrigieren ob sie mitkopiert werden oder nicht
------ ende schleife -----------
free(text);

manalishi

tl;dr
Avatar
Registered: Feb 2001
Location: Feldkirch
Posts: 5977
du könntest beim while EOL und EOF noch berücksichtigen.. z.b. while(c!=' ' && !feof(fin))

zum debuggen könntest du beispielsweise jedes zeichen, das du in den string word schreibst, gleich wieder ausgeben.

daff

I hate your life
Avatar
Registered: Nov 2000
Location: Vienna, Austria
Posts: 129
könntest du nicht fscanf() verwenden um den stream zu lesen und um die größe des pointers wort für wort weiterzuhüpfen? bei leerzeichen stoppt fscanf() eh ganz brav. ich bild mir ein das mal so gemacht zu haben...JAT...

someoneoutthere

Bloody Newbie
Avatar
Registered: Jun 2002
Location: 1040
Posts: 43
fscanf darf ich leider nicht verwenden, stattdessen sollte ich fgets/sscanf nehmen, oder halt irgendwas anderes.

someoneoutthere

Bloody Newbie
Avatar
Registered: Jun 2002
Location: 1040
Posts: 43
while (fgets(line, 256, fin) != NULL)
{
while (sscanf(line, "%s", word) != 0)
{


hab ich im moment.. aber liest mir immer nur das erste wort;(

FMFlash

tranceCoder
Avatar
Registered: Mar 2001
Location: Wien
Posts: 2037
hier bitte, einlesen aus einem file, die worte werden in einem struktur-array gespeichert:

#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <io.h>
#include <stdio.h>

typedef char KBYTE [1024];

typedef struct
{
char str [64];
}TOKEN;

int main (int argc, char **argv)
{
KBYTE in;
char buf [1000000];
char *pch;
long count = 0,
x,
read;

TOKEN tok [100];

int file = _open ("test.txt", _O_RDONLY | _S_IREAD | _O_TEXT);

strcpy (buf, "");

while (!_eof (file))
{
read = _read (file, (char*)in, 1024);
in [read] = '\0';

strcat (buf, in);
}

for (x = 0; x < (long)strlen (buf); x++)
{
if (buf [x] == ' ')
count++;
}

pch = strtok (buf, " ");

strcpy (tok[0].str, pch);

for (x = 1; x < count; x++)
{
pch = strtok (NULL, " ");
strcpy (tok[x].str, pch);
}

pch = strtok (NULL, "\0");
strcpy (tok[x].str, pch);

for (x = 0; x <= count; x++)
printf ("token #%d: %s\n", x, tok[x].str);

_close (file);

return 0;
}
Bearbeitet von FMFlash am 10.12.2002, 14:50

someoneoutthere

Bloody Newbie
Avatar
Registered: Jun 2002
Location: 1040
Posts: 43
while ((c = fgetc(fin)) != EOF)
{
if ((c == 10) || (c==' ') || (c=='\t')) break;
word[i++] = c;
}
word[i] = '\0';


while (!feof(fin))
{

.. und dann den einlesevorgang hier nochmal
}



so gehts
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz