Вы не выделяете память для массива структур, которые вы пытаетесь скопировать в выходной файл, а также для элементов массива символов в вашей структуре.Простое копирование указателя, возвращенного из strtok()
, не будет работать, поскольку оно указывает на статический массив символов внутри функции strtok()
.Таким образом, в основном, после одного прохода через цикл while, и temp.AccountName
, и temp.LastPaymentDate
указывают на одну и ту же область памяти.Кроме того, как было отмечено выше в chemuduguntar, когда вы записываете структуру, вы записываете только указатели памяти ... в вашей структуре нет фактических строковых данных , которые, как вы полагаете, являются символьнымимассивы.
У вас есть два варианта ... либо объявить вашу структуру со статическим хранилищем для хранения строковых массивов, а затем использовать strcpy()
для копирования данных из strtok()
в эти массивы, либо использовать malloc()
и выделите память для ваших указателей (только помните, что вам придется освобождать эти указатели позже, если вы не хотите утечек памяти).
Так, например, вы могли бы сделать что-то вроде этого:* Затем внутри вашего цикла while, когда вы вызываете strtok()
, вы можете сделать это:
tok = strtok(NULL, ",");
strncopy(temp.AccountName, tok, MAXBUFSIZE);
temp.AccountName[MAXBUFSIZE] = '\0'; //safety NULL termination
//...more code
tok = strtok(NULL, ",");
strncopy(temp.LastPaymentDate, tok, MAXBUFSIZE);
temp.LastPaymentDate[MAXBUFSIZE] = '\0'; //safety NULL termination
Теперь при таком подходе в ваших структурах есть фактические данные, которые не указывают на какое-то временное хранилище где-нибудьЕдинственным недостатком этого подхода является то, что если вы превысите 512 байт, вы обрежете эти данные.Если у вас меньше 512 байт, то у вас будут все нули, дополняющие конец массивов символов.
Далее, где-то вам нужно объявить:
Person myarray[10];
или
Person* myarray = calloc(10, sizeof(Person));
потому что прямо сейчас каждый раз, когда вы проходите цикл while, вы перезаписываете предыдущее значение temp
.Поэтому в какой-то момент вам нужно скопировать структуру temp
в более постоянный массив хранения.Например, в конце вашего цикла while вы должны вызвать:
memcpy(&myarray[LOOPNUMBER], &temp, sizeof(Person));
Наконец, для вызова fwrite () я бы немного изменил это так:
for(i=0;i<10;i++)
{
fwrite(myarray, sizeof(Person), 10, fpData);
}
И снова, если вы используете указатели с malloc()
, calloc()
и т. Д., Обязательно освободите это хранилище после вызова free()
.
Надеюсь, это поможет,
Jason