![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 11.03.2017
Сообщений: 23
|
![]()
Не работает функция считывания структуры из файла (fromfile()).
И второе: неоходимо по номеру введенному номеру id изменить оценки студента, но работает только с введенным последним id, в чем могут быть ошибки? Код:
|
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
![]()
Тут фундаментальный косяк есть. Структуры в памяти машины выравниваются компилятором, чтобы были оптимально быстрые. Скажем, процессор эффективно глотает по 8 байт за раз. Поэтому поля будут выровнены, чтобы быть кратными 8. Этот момент у вас никак не учитывается. Он может проявлятся, а может и нет - от многих факторов зависит. Причем, если у вас тестовый файл создан на другой машине, вероятнее всего ниче не заработает.
Вобщем смысл такой - структуру, которые должны сериализироватся в поток байт (файл) нужно специальным образом компилировать, запрещая вольности компилятору. В GCC делатеся так https://gcc.gnu.org/onlinedocs/gcc-3...ttributes.html (__aligned(packed)__) Для визуалки ищите.. Ну там еще по мелочи у вас утечки памяти, например тут Код:
Код:
Ну и файл остается не закрытым, значит может не читатся при следущем запуске и т.д. Сделайте правильную очистку в конце програмы занятых ресурсов. Последний раз редактировалось alexzk; 13.04.2018 в 14:42. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 11.03.2017
Сообщений: 23
|
![]()
хорошо, спасибо, попробую, а что с циклом изменения оценок, не подскажете? он последнюю структуру только меняет
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 11.03.2017
Сообщений: 23
|
![]() |
![]() |
![]() |
![]() |
#5 | |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
![]() Цитата:
...если вы в каждой ф. закрываете, то как будет работать 2 и 3 функции, после того, как файл закрыт 1й?) Нет, открыли в начале проги, закрыли в конце. А функции, должны еще делать перемотку fseek, т.к. для файла запоминается позиция, и вторая ф. продолжит чтение с места, где остановилась 1я. Это не совсем то, что вы хотите вроде. Если вы И читаете И пишите, то перемотка обязательна м-у ними. Без перемотки может быть че угодо - вплоть до радиоактивного пепла ![]() Последний раз редактировалось alexzk; 13.04.2018 в 14:59. |
|
![]() |
![]() |
![]() |
#6 | |
Пользователь
Регистрация: 11.03.2017
Сообщений: 23
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
![]()
Сначала разберитесь с кашей в файле
FILE *file = fopen(filename,"rb"); fopen(filename,"a+b"); Такого быть не должно. Файл открывается 1 раз, закрывается 1 раз и в м-у чтением и записью обязательно делается перемотка. Да, и если вы хотите изменить уже записанную запись, то нужно перемотать на нее и записать занова (поверх). |
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 11.03.2017
Сообщений: 23
|
![]() |
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 11.03.2017
Сообщений: 23
|
![]() Код:
|
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
![]()
В каждой функции открывать-закрывать - будет сильно тормозить.
![]() Пермотка нужна, если вы держите файл открытым. При вашем подходе - там все равно при открытии установить или в конец, или в начало. Так, теперь ошибки, вот в теле программы: FILE *file = fopen(fName, "a+b"); Дальше срабатывает infile и делает fclose(), как теперь будет работать fromfile? Файл уже все - закрыт. Ага, и для компенсации этого факта вы его снова открываете FILE *file = fopen(filename,"rb"); Сделайте 1 fopen и 1 fclose вообще на целую программу. Ровно по 1 разу. Во всех остальных местах обойдитесь без них, использую перемотку. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Считывания русского текста из файла | apeorin | Общие вопросы C/C++ | 14 | 02.12.2012 16:34 |
Считывания массива из файла | Daleaids | Общие вопросы C/C++ | 4 | 23.12.2011 15:41 |
Процедура считывания из файла | Black_butterfly | Помощь студентам | 0 | 29.05.2011 16:51 |
Возникла проблема считывания текстового файла | Aerial | Общие вопросы C/C++ | 2 | 20.09.2010 10:29 |
потоки сохранение и считывания файла [C++] | ArniLand | Общие вопросы C/C++ | 1 | 27.05.2010 23:27 |