# .txt Datei einlesen und in Array speichern



## forsti222 (16. Januar 2013)

Hey Leute, brauche schnelle und dringende Hilfe, verzweifle an einen Uni Beispiel, muss aus den folgenden Textinput:



> John,Smith,1964,11,11
> John,Doe,1972,3,27
> Susan,Blake,1957,5,3
> Anna,Doe,1952,1,12
> ...


Festellen können wievele Freunde jeder hat
oben sind immer die Namen mit GB Datum und unten bedeutet
1 <->2 das der erste mit den 2 befreundet ist usw

Weiters soll man auch weitergehen können und sagen wie tief man schauen will, also wenn zb 1 mit 2 befreundet ist, und dann 2 mit 3, dass man sagt 1 hat trotzdem 2 freunde...

Ich scheitere hier schon am verarbeiten der Textdatei in einen Array speichern, vll kann mir da jemand helfen.
Hier mein Ansatz (C)



```
ErrCode parseRatings(IFB *ifb) {

    int count_friends=0;

    char name[20];

    memset(&name[0], 0, sizeof(name));

    char friends[20];

    memset(&friends[0], 0, sizeof(friends));

    int number=0;

    char fName[20];

    memset(&fName[0], 0, sizeof(fName));

    char lName[20];

    memset(&lName[0], 0, sizeof(lName));

    int yYear, mMonth, dDay;

    int place = 0;

    int x = 0;

    int ID = 0;

    int temp;

    int age;

    int second = 0;

    int sx = 0;

    int i = 0;



	if (ifb->input != NULL) {

    while((temp = fgetc(ifb->input))!=EOF) {

        if(place < 2) {

            if(temp == 44) {

                if (place == 0) {

                        strncpy(fName, name,x);

                } else {

                        strncpy(lName, name,x);}

                x=0;

                place++;

            } else if (temp == '~') {

               second = 1;

               //printf("Hallo");

                }

                 else {

                name[x] = temp;

                x++;

            }

        }

         else {

    if((temp == 44 || temp == 10) && place !=5) {



        if(place == 2) {yYear = number;} else if (place == 3) {mMonth = number;} else {dDay = number;}

            place++;

            number = 0;

            x=0;

            }

            else {

                number = (number*10) + (temp-48);

            }

        }

    //printf("place %i",place);

    if(temp == 10 && second == 0) {



    ID++;

    x = 0;

    place = 0;

    if(mMonth<= 1 ) {

        if(dDay <= 15) {

            age = 2013-yYear;

        }

    }

    else {

            age = 2012-yYear;

        }

        printf("ID: %i ", ID);

        printf("Name: %s %s", fName, lName);

        printf(", age %i",age);

        printf(" with %i friends",count_friends);

        printf("\n");

        memset(&fName[0], 0, sizeof(fName));

        memset(&lName[0], 0, sizeof(lName));

        memset(&name[0], 0, sizeof(name));

        yYear = 0;

        mMonth = 0;

        dDay = 0;

        }

        else if(second == 1){

                if(temp != '~') {

                    putchar(temp);

                    if(temp == 10) {

                    }

                    if(temp != 10 && temp != '<' && temp != '>' && temp != '-') {

                            friends[i] = temp;

                            i++;

                        sx++;

                    }

                }





        }

        }

	}

	printf("Friends 0,1 %c", friends[1]);
	printf("sx %i",sx);
	int friends_count[ID+1];
	int a = 0;
	while(a<ID) {
		friends_count[a] = 0;
		a++;
	}
	a=0;
	while(a<sx) {
		friends_count[friends[a]]++;
	}
	printf("Friendscount %i",friends_count[1];

	//printf("Friends %i i %i",sx,i);

	return SUCCESS;

}
```
Danke an alle schonmal


----------



## cwriter (16. Januar 2013)

Hallo

Es ist mir nicht ganz klar, was IBF ist. Aber das ist Nebensache.
Ok: Eine Textdatei zu lesen, geht natürlich mit fgetc(). Komfortabler wäre aber fgets(), das die Datei zeilenweise liest.
Dann kannst du per strtok() die Elemente von

```
John,Smith,1964,11,11
```
zu

```
John
Smith
1964
11
11
```
machen und die Elemente dann einfacher in einen Speicher laden, z.B. in

```
char name[100][100];
strcpy(name[0],name); //name beinhaltet John

//Etwas später (1<->2)
printf("%d (%s) ist mit %d (%s) befreundet.\n",pers1,name[pers1],pers2,name[pers2]);
```

Gruss
cwriter


----------



## Cromon (18. Januar 2013)

Einfacher als strtok wäre im obigen Fall in dem du ein fixes Muster hast sscanf


```
char vorname[100] = { 0 }, nachname[100] = { 0 };
int gebJahr = 0, gebMonat = 0, gebTag = 0;

if(sscanf(line, "%s,%s,%i,%i,%i", vorname, nachname, &gebJahr, &gebMonat, &gebTag) == 5) {
       // OK
}
```


----------



## deepthroat (21. Januar 2013)

Cromon hat gesagt.:


> Einfacher als strtok wäre im obigen Fall in dem du ein fixes Muster hast sscanf
> 
> 
> ```
> ...


Das würde so aber nicht funktionieren, da %s ein ganzes Wort einliest, also erst am nächsten Leerzeichen stoppt. Man müßte %[^,] verwenden.


----------

