Это соответствующая часть кода, отображаемого в данный момент:
cfPtr = fopen("credit.dat", "rb+");
fread(&client, sizeof(struct clientData), 1, cfPtr);
client.balance -= serviceCharge;
fseek(cfPtr,(client.acctNum - 1) * sizeof(struct clientData), SEEK_CUR);
fwrite(&client, sizeof(struct clientData), 1, cfPtr);
Я предполагаю, что проверка ошибок возвращаемых значений функции «не нужна»;это должно быть там, но это немного усложнит вещи.Однако я бы не стал доверять себе, чтобы написать программу без проверки ошибок - слишком много вещей может пойти не так, как мне хочется (и горький опыт).
- Вы читаете запись со смещением 0 вфайл.Затем вы обновляете баланс, ищите позицию на основе номера счета клиента относительно текущей позиции и затем записываете данные обратно.
В другое время мы можем обсудить мудрость двоичного кодаформат данных, который вы используете;на данный момент этого достаточно.
Вот код, который «работает»:
#include <stdio.h>
struct clientData
{
int acctNum;
char lastName[15];
char firstName[10];
double balance;
};
static void print_client(struct clientData *data)
{
printf("%04d %-15s %-15s %6.2f\n", data->acctNum, data->lastName,
data->firstName, data->balance);
}
int main(void)
{
FILE *cfPtr;
struct clientData client = {0, "Me", "Mine", 50.0};
double serviceCharge = 5.0;
/* Initialize */
cfPtr = fopen("credit.dat", "wb");
fwrite(&client, sizeof(struct clientData), 1, cfPtr);
fclose(cfPtr);
/* Update */
cfPtr = fopen("credit.dat", "rb+");
fread(&client, sizeof(struct clientData), 1, cfPtr);
print_client(&client);
client.balance -= serviceCharge;
fseek(cfPtr, 0, SEEK_SET);
fwrite(&client, sizeof(struct clientData), 1, cfPtr);
fclose(cfPtr);
/* Validate */
cfPtr = fopen("credit.dat", "rb");
fread(&client, sizeof(struct clientData), 1, cfPtr);
fclose(cfPtr);
print_client(&client);
return 0;
}
Это тоже работает ... не пропускает 0 идентификаторов клиентов, потому что негенерируй.Но вы можете справиться с этим.
#include <stdio.h>
struct clientData
{
int acctNum;
char lastName[15];
char firstName[10];
double balance;
};
static void print_client(const struct clientData *data)
{
printf("%04d %-15s %-15s %6.2f\n", data->acctNum, data->lastName,
data->firstName, data->balance);
}
/* Initialize file */
static void init_file(const char *filename)
{
FILE *cfPtr = fopen(filename, "wb");
int i;
for (i = 1; i <= 30; i++)
{
struct clientData client = { i, "", "", i * 50.0};
sprintf(client.lastName, "Me (%d)", i);
sprintf(client.firstName, "Mine (%d)", i);
fwrite(&client, sizeof(struct clientData), 1, cfPtr);
}
fclose(cfPtr);
}
static void print_file(const char *filename)
{
struct clientData client;
FILE *cfPtr = fopen(filename, "rb");
while (fread(&client, sizeof(struct clientData), 1, cfPtr) == 1)
print_client(&client);
fclose(cfPtr);
}
int main(void)
{
FILE *cfPtr;
double serviceCharge = 5.0;
const char *filename = "credit.dat";
struct clientData client;
init_file(filename);
printf("Post-initialization: %s\n", filename);
print_file(filename);
/* Update */
cfPtr = fopen(filename, "rb+");
while (fread(&client, sizeof(struct clientData), 1, cfPtr) == 1)
{
client.balance -= serviceCharge;
fseek(cfPtr, -1 * (long)sizeof(struct clientData), SEEK_CUR);
fwrite(&client, sizeof(struct clientData), 1, cfPtr);
fseek(cfPtr, 0, SEEK_CUR);
}
fclose(cfPtr);
printf("Post-update: %s\n", filename);
print_file(filename);
return 0;
}
Смотрите также комментарии ...