l oop продолжать печатать tra sh значения, обрабатывать двоичные файлы - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь выяснить, что заставляет этот l oop обрабатывать мои структуры, а затем продолжать создавать значение tra sh, внутренний l oop работает и обновляет зарплаты, а внешний l oop, который я использовал раньше как автономный (если я использую только функцию печати, которая работает с тем же, пока l oop, не проходя через эту функцию, она напечатает мои 2 структуры без значений tra sh), и это сработало:

while (fread(&worker, sizeof(Employee), 1, file1) == 1)
    {
        fseek(file2, 0, SEEK_SET);
        while (fread(&salary, sizeof(SalaryIncrement), 1, file2) == 1)
        {
            if (worker.id == salary.idEmployee)
            {
                worker.salary += salary.Salaryincrement;
                fseek(file1, -ByteEmpolyee, SEEK_CUR);
                fwrite(&worker, ByteEmpolyee, 1, file1);
            }
        }

    }

я также добавляю свой полный код, если кто-то хочет его посмотреть, заранее спасибо

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

typedef struct
{
    long id;
    char name[20];
    float salary;
}Employee;

typedef struct
{
    long idEmployee;
    float Salaryincrement;
}SalaryIncrement;

void AddingEmployee(char* fileName);
void AddingSalaryIncrement(char* filename);
void UpdateSalary(char* filename, char* filename1);
void printEmployee(char* filename);

void main()
{
    AddingEmployee("ListEmployees.bin");
    AddingSalaryIncrement("SalaryIncrement.bin");
    UpdateSalary("ListEmployees.bin", "SalaryIncrement.bin");
    printEmployee("ListEmployees.bin");
    system("pause");
}

void AddingEmployee(char* filename)
{
    FILE* file1 = fopen(filename, "ab");
    if (file1 == NULL) {
        printf("Unable to open file.\n");
        exit(1);
    }
    Employee worker;
    printf("Adding a new employee:\n");
    printf("\nPlease enter the employee's ID , name, Salary: ");
    scanf("%ld %s %f", &worker.id, worker.name, &worker.salary);
    fwrite(&worker, sizeof(Employee), 1, file1);
    fclose(file1);
}

void AddingSalaryIncrement(char* filename)
{
    FILE* file1 = fopen(filename, "ab");
    if (file1 == NULL) {
        printf("Unable to open file.\n");
        exit(1);
    }
    SalaryIncrement salary;
    printf("Add SlaryIncrement:\n");
    printf("Please inset the following: ID , salaryincrement: ");
    scanf("%ld %f", &salary.idEmployee, &salary.Salaryincrement);
    fwrite(&salary, sizeof(SalaryIncrement), 1, file1);
    fclose(file1);
}

void UpdateSalary(char* filename, char* filename1)
{
    Employee worker;
    SalaryIncrement salary;
    FILE* file1 = fopen(filename, "rb+");
    if (file1 == NULL) {
        printf("Unable to open file.\n");
        exit(1);
    }
    FILE* file2 = fopen(filename1, "rb");
    if (file2 == NULL) {
        printf("Unable to open file.\n");
        exit(1);
    }
    int ByteEmpolyee = sizeof(Employee);
    int ByteSalary = sizeof(SalaryIncrement);
    while (fread(&worker, sizeof(Employee), 1, file1) == 1)
    {
        fseek(file2, 0, SEEK_SET);
        while (fread(&salary, sizeof(SalaryIncrement), 1, file2) == 1)
        {
            if (worker.id == salary.idEmployee)
            {
                worker.salary += salary.Salaryincrement;
                fseek(file1, -ByteEmpolyee, SEEK_CUR);
                fwrite(&worker, ByteEmpolyee, 1, file1);
            }
        }

    }
    fclose(file1);
    fclose(file2);
}

void printEmployee(char* filename)
{
    Employee worker;
    FILE* file1 = fopen(filename, "rb");
    if (file1 == NULL) {
        printf("Unable to open file.\n");
        exit(1);
    }
    while (fread(&worker, sizeof(Employee), 1, file1) == 1)
    {
        printf("ID: %ld\t\t Name: %s\t\t Salary: %0.2f\n", worker.id, worker.name, worker.salary);
    }

}

1 Ответ

0 голосов
/ 26 мая 2020

Мне удалось решить этот l oop, когда я заменил его следующим: (но это все еще происходит с другим, и я до сих пор не знаю почему)

    fseek(file1, 0, SEEK_END);
    int size = ftell(file1)/sizeof(Employee);
    fseek(file1, 0, SEEK_SET);
    for (int i = 0; i < size; i++)
    {
        fread(&worker, sizeof(Employee), 1, file1);
        fseek(file2, 0, SEEK_SET);
        while (fread(&salary, sizeof(SalaryIncrement), 1, file2) == 1)
        {
            if (worker.id == salary.idEmployee)
            {
                worker.salary += salary.Salaryincrement;
                fseek(file1, -ByteEmpolyee, SEEK_CUR);
                fwrite(&worker, ByteEmpolyee, 1, file1);
            }
        }
    }
...