2015-11-09 2 views
0

Я пытаюсь читать строки за строкой из текстового файла и помещать значения в структуру.Структура и указатель в C

Мой вход:

name1 name2 01.01.2015. ,

Код, который я написал ниже, работает, но все массивы имеют одинаковые значения (последней строки файла). Я думал, это потому, что мои элементы только справляются с указателем? Но до сих пор не удалось найти решение для этого? Может быть, кто-то быстро поможет.

int main() { 

struct table { 
    char *nachname; 
    char *vorname; 
    char *tag; 
    char *monat; 
    char *jahr; 
    int q; 
}; 

int i; 
char *file = "OefbTeam1neu.dat", *token; 
int lines = getLineCount(file); 
FILE *readtxt = fopen(file, "r"); 
struct table team[lines]; 

//char vn[lines][100], nn[lines][100], geb[lines][100]; // array of characters in array of strings 

rewind(readtxt); 

for(i=0 ; i < lines ; i++) { 

    char vn[100], nn[100], geb[100]; 
    char *t , *m , *y; 
    int iread = fscanf(readtxt, "%s %s %s \n", nn, vn, geb); 

    token = strtok(geb, "."); 

    while(token != NULL) { 
     t = token; 
     token = strtok(NULL, "."); 
     m = token; 
     token = strtok(NULL, "."); 
     y = token; 
     token = strtok(NULL, "."); 
    } 

    team[i].nachname = nn; 
    team[i].vorname = vn; 
    team[i].tag = t; 
    team[i].monat = m; 
    team[i].jahr = y; 
    team[i].q = i; 

    //printf("%s %s %s %s %s \n", team[i].nachname, team[i].vorname, team[i].tag, team[i].monat, team[i].jahr); 
} 
fclose(readtxt); 
} 

ответ

0

Поскольку вы используете одни и те же массивы (Vn, пп, ГЭБ) для каждой итерации, так что поля в структуре таблицы имеют одинаковый адрес, поэтому все они указывают на ту же строку. С каждой итерацией вы читаете следующую строку в файле в этих буферах, поэтому в содержимом этих массивов будет отображаться последняя строка.

0

Вы используете такую ​​же временную переменную для всех элементов team[] .. так что все team[] элементов указывают на последний элемент.

Вы должны иметь независимую память для каждого team[] элемента, например, в вашей структуре:

struct table { 
    char nachname[100]; 
    char vorname[100]; 
    char tag[100]; 
    char monat[100]; 
    char jahr[100]; 
    int q; 
}; 

и скопировать временные строковые буфера с зЬгсром ..

strcpy(team[i].nachname, nn); 
strcpy(team[i].vorname, vn); 
strcpy(team[i].tag, t); 
strcpy(team[i].monat, m); 
strcpy(team[i].jahr, y); 

Bye!

+0

благодарит за помощь! – coo12

Смежные вопросы