Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Ogienko
5 / 5 / 5
Регистрация: 28.11.2014
Сообщений: 40
1

Перевод указателя на N байт в файловом потоке

19.06.2016, 21:04. Просмотров 251. Ответов 1

Добрый день, помогите пожалуйста. Есть структура:

C++
1
2
3
4
5
struct Mystruct {
    char surname[20]; // Фамилия
    char numberOfTestBook[9]; // Номер зачетной книжки
    int evaluation[4]; // Оценки за экзамен
} student;
Происходит прямой ввод/вывод записей из файла.

Одна из функций:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void FindUnsatisfactoryStudents(FILE *file) // Поиск не удв. и корректировка
{
    char ch;
    long size;
    file = fopen("DataBase.dat", "rb+"); // Открытие бинарного файла для чтения и записи
    fread(&student, sizeof(student), 1, file); // Чтение из файла одной структуры
    while (!feof(file))
    {
        if (student.evaluation[0] < 3 || student.evaluation[1] < 3 || student.evaluation[2] < 3 || student.evaluation[3] < 3)
        {
            printf("\nSurname: %s\n", student.surname);
            printf("Number test book: %s\n", student.numberOfTestBook);
            printf("The first estimate for the exam: %d\n", student.evaluation[0]);
            printf("The second estimate for the exam: %d\n", student.evaluation[1]);
            printf("Third grade for the exam: %d\n", student.evaluation[2]);
            printf("Fourth grade for the exam: %d\n", student.evaluation[3]);
            printf("\nCorrect? (y/n)\n");
            ch = _getch();
            if (ch == 'y')
            {
                printf("\nThe first estimate for the exam: ");
                scanf("%d", &student.evaluation[0]);
                printf("The second estimate for the exam: ");
                scanf("%d", &student.evaluation[1]);
                printf("Third grade for the exam: ");
                scanf("%d", &student.evaluation[2]);
                printf("Fourth grade for the exam: ");
                scanf("%d", &student.evaluation[3]);
                size = sizeof(student);
                fseek(file, -size, SEEK_CUR);
                fwrite(&student, sizeof(student), 1, file); // Запись изменённой структуры на прежнее место
            }
        }
        fread(&student, sizeof(student), 1, file);
    }
    fclose(file);
}
Если была найдена структура с студентом у которого есть хоть 1 оценка меньше 3, то происходит запрос на корректировку его данных.

Далее вводится новая информация, и вот в чем вопрос, как записать эту структуру файл в то же место, откуда она была прочитана.

По сути нужно указатель вернуть назад на количество байт занимаемой 1 структурой, вот код:

C++
1
2
3
size = sizeof(student);
fseek(file, -size, SEEK_CUR);
fwrite(&student, sizeof(student), 1, file); // Запись изменённой структуры на прежнее место
Но после этого кода, структура файла сбивается. Прошу помочь, спасибо.

Добавлено через 3 часа 24 минуты
Спасибо за большую помощь, разобрался сам.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2016, 21:04
Ответы с готовыми решениями:

В чем ошибка в файловом потоке?
Есть программа. В файле borders.in такой текст: 6 6 2 1 1 4 4 3 3 6 6 . В...

Перемещение указателя в потоке
почему при выводе финальном на экран выводится только последняя...

Перевод указателя в итератор
Есть объект лежащий в списке. В объекте есть метод, который должен этот объект...

Перевод указателя в начало файла - C++
Мне нужно перевести указатель в начало файла для дальнейшей работы с ним....

Перевод указателя в начало файла
Мне нужно перевести указатель в начало файла для дальнейшей работы с ним....

1
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
19.06.2016, 21:41 2
Цитата Сообщение от Ogienko Посмотреть сообщение
разобрался сам.
Молодец. Извини что мы не так оперативно работаем.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2016, 21:41

Перевод строки в массив байт
Доброго времени суток. Мне нужно сделать класс длинных целых чисел как...

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя?
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании...

Создание указателя на экземпляр класса, описанного после объявления указателя
Здравствуйте! Проблема в том, что нужно сделать так: class A{ public: B*...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru