.txt auslesen einfügen in Array

Nico1989

Mitglied
Hi, wie es der Titel schon verrät möchte ich eine txt file auslesen (zeichenweise) und es dann in ein Array einfügen.
Ich hab dazu schonmal ein bisschen Code erstellt doch ich denke da hakt es noch ein bisschen ich versteh allerdings nicht genau warum. Rein Logisch bin ich der Meinung das es funktionieren könnte / sollte. Aja und muss ich speicher für mein Array of Strings allokieren ? Wenn ja wie würde ich das mit meiner funktionalität realisieren können?

#Fehler: endlosschleife, in mein Array wird nichts reinkopiert
Compiler: Gcc, Ubuntu

Ich bin wie immer für jede Hilfe Dankbar !

Code:
#include <stdio.h>
#include <stdlib.h>
#define maxKw 10 /*Max amount of Keywords*/

typedef char *string;

void readKeywords(char **argv, string words[maxKw])
{
	int i;
	/*int len;*/
	int x;
	i = 0;
    FILE *file = fopen(argv[1], "r" );

    /* fopen returns 0, the NULL pointer, on failure */
    if ( file == 0 )
    {
		printf( "Could not open file\n" );
    }
    else 
    {
    while  (( x = fgetc( file )) != EOF )
    {
		printf("asdf");
		while  (( x = fgetc( file )) != '\0' )
        {
			printf("asdf");
			strcat(words[i], x); 
			/*len++;*/
        }
        i++;
    }
    fclose( file );
	}
}

int main(int argc, char *argv[])
{
	string words[10];
	int i;
	readKeywords(argv, &words[maxKw]);
	for (i=0; i < maxKw; i++)
	{
		printf("%s", words[i]);
	}
	
return 0;	
}
 
Hallo

C:
typedef char *string;
Bitte nicht. Spätestens mit dem std::string kommst du damit in Teufels Küche.
C:
/* fopen returns 0, the NULL pointer, on failure */
NULL ist (void*)0, nicht dasselbe wie 0. file == NULL wäre schöner, so funktioniert es aber auch. Meistens.

C:
while  (( x = fgetc( file )) != EOF )
    {
        printf("asdf");
        while  (( x = fgetc( file )) != '\0' )
        {
            printf("asdf");
            strcat(words[i], x); 
            /*len++;*/
        }
        i++;
    }
Das ist nun der interessante Teil. Du liest zwar jedes einzelne Zeichen, aber jedes zweite wird damit übersprungen. Zudem ist strcat... Moment. Geht das denn überhaupt? Wut?
C:
while  (( x = fgetc( file )) != EOF )
{
    words[i] = x;
    i++;
}
So ist's doch besser, nicht?
Zur Aufrufung:
C:
    string words[10];
    int i;
    readKeywords(argv, &words[maxKw]);
Sag mal, der kompiliert dir das nicht wirklich, oder?
readKeywords() verlangt als zweiten Parameter einen string* (char**). Du übergibst ihm aber einen string** (char***).

C:
printf("%s", words[i]);

Nein.
C:
printf("%c", words[i]);

Warum du aber nicht einfach puts(words) machst, weiss ich auch nicht.

Sorry, hier beginnt genau das Problem. Du liest für jeden Array nur ein Zeichen ein.
Wo tritt die Endlosschlaufe eigentlich auf? Und du weisst schon, dass du einen schönen Stackoverflow machst, wenn du mehr als 10 Zeichen einliest, oder?

Gruss
cwriter
/EDIT
Aja und muss ich speicher für mein Array of Strings allokieren ?
Ja.

Es gab in letzter Zeit einige ähnliche Fragen hier:
http://www.tutorials.de/c-c/396241-verkehrte-string-und-speicherverwaltung.html
http://www.tutorials.de/c-c/396280-zeichen-mit-der-konsole-einlesen.html

/EDIT 2
Array von strings? Willst du einen 1D-Array oder einen 2D-Array haben?

/EDIT 3
Könntest du uns mitteilen, was genau du eigentlich willst? Der Code ist zwischen Stuhl und Bank bzw. 1D und 2D...
 
Zuletzt bearbeitet:
es soll 1D sein, es stehen wörter in meinem file
etwa so:
wort1
wort2
wort3
wort4
im endeffekt möchte ich die wörter aus der Textdatei in ein simples Array of Strings...wie mir C aber schmerzlich beibrachte ist dies nicht ganz so einfach :D
 
Ein Array of Strings ist eben nicht 1D, sondern 2D. Eine Dimension für die Wörter, die andere für die einzelnen Buchstaben.
C:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    //Zuerst überprüfen, ob überhaupt genügen Informationen da sind
    if(argc < 2) return -1;
    char* string = NULL; //Bitte ohne typedef. IMHO ist das etwas vom Übelsten, was die C Sprache hervorgebracht hat.
    FILE* f = fopen(argv[1]);
    if(f == NULL) return -2;
    fseek(f,0,SEEK_END); //Den "Cursor" ans Ende setzen
    size_t size = ftell(f);   //Die Grösse der Datei lesen
    rewind(f);                   //Zurück an den Anfang

    string = (char*)malloc(size);
    if(string == NULL) return -3;
    fread(string,1,size,f); //String gefüllt
    puts(string);
    fclose(f);
    free(string);
    return 0;
}

Das liest dir die Datei in den Arbeitsspeicher.
Stelle bitte konkrete Fragen, ich werde dir dir zuliebe keinen Code schreiben, sonst lernst du nix.

Gruss
cwriter
 
ahhh jetzt bin ich dabei
bei deinem Code werden jetzt alle wörter in das array of chars eingefügt richtig ? wie könnte ich konkret jedes einzelne wort mit anderen abgleichen oder einfacher gesagt wie greife ich auf die wörter aus dem array of chars zu ?
 
Wörter sind immer von Leerzeichen abgetrennt, in deinem Beispiel von '\n'.
Also
C:
int lastword = 0;
for(int i = 0;i<size;i++)
{
    if(words[i] == '\n')
   {
       char* word = (char*)malloc(i-lastword+1);
       if(word == NULL) return -3;
       memcpy(word,words + lastword,i-lastword);
       word[i - lastword] = '\0';
       lastword = i;
       puts(word);
       free(word);
   }
}

Im Prinzip funktioniert das so: Du hast deine lange Kette an Zeichen. Dann suchst du die Trennzeichen und nutzt diese zur Zerlegung des Urstrings.
Der Code ist ungetestet.

Gruss
cwriter
 
Zurück