Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ogienko
5 / 5 / 1
Регистрация: 28.11.2014
Сообщений: 40
#1

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

19.06.2016, 21:04. Просмотров 194. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевод указателя на N байт в файловом потоке (C++):

В чем ошибка в файловом потоке? - C++
Есть программа. В файле borders.in такой текст: 6 6 2 1 1 4 4 3 3 6 6 . В файл borders.out выводится сам массив. Во время компиляции...

перемещение указателя в потоке... - C++
почему при выводе финальном на экран выводится только последняя цифра...подскажите тему тольео начали учить сегодня?! #include...

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

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

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

Перевод строки в массив байт - C++
Доброго времени суток. Мне нужно сделать класс длинных целых чисел как массив байт. Вопрос в том, как реализовать конструктор,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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(тип) не тождественно инкременту этого же указателя? - C++
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс) увеличивается на 4 (размер int в...

Преобразование кода без указателя в код с использованием указателя - C++
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;fstream&gt; using namespace...

Как сделать функцию от указателя на класс и указателя на метод? - C++
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод. Обращаться к классу нужно именно по указателю,...

В чём отличие константного указателя и указателя на константу? - C++
int *const p1 и int const* p2 Объясните мне в чём тут отличие.


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

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

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