С++ Как правильно изменить элемент записи структуры с последующей записью в файл?

123
16 июля 2019, 04:10

Необходимо:

  1. Получить данные с файла
  2. Записать данные в структуру
  3. Изменить значение элемента записи структуры
  4. Записать измененную структуру обратно в файл

На данном этапе имеется следующий код:

struct TZap{                // Структура 
     char FIO[30];          
     char n_group[5];       
     char god_r[4];         
     double o_fizika;        
     double o_matematica;    
     double o_informatica;  
     double o_himia;        
     double s_b;            
} Zap;
int size = sizeof(TZap);        // Получаем размер записи структуры
FILE *Fz, *Ft; 
char File_Zap[] = "zapisi.dat"; // Файл в котором хранятся данные 
Fz = fopen(File_Zap,"r+b");     // Открываем файл для изменения данных
D_f = fileno(Fz);               
len = filelength(D_f);          // Получаем размер Файла
unsigned kol = len/size;        // Получаем количество строк
TZap* mas_Z = new TZap[kol];    // Создаем объект структуры 
cout << "\t FIO \t\t GROUP \t GOD \t FIZIKA \t MATH \t\t INFORM \t HIMIA \t\t SREDNEE"  << endl;              // Названия столбцов для вывода 
for (i=0; i < kol; i++){        // Выводим структуру в виде таблицы
    fread((mas_Z+i), size, 1, Fz); 
    Out(mas_Z[i]);  
}       
printf("\n\n Kol studet - %i.\n Select student to NUMBER ", kol); 
scanf("%i", &kodS); // Вводим номер строки для редактирования 
if ((kodS>0) && (kodS<kol+1)){ // Если Номер строки существует, то выполняем код
  printf("\n F.I.O. - "); 
  char Stroka[30];             // Создаем буферную переменную
  scanf("%s", Stroka);         // Вводим новое значения элемента записи
  cout << "\n\t STROKA = "  << Stroka << endl; // Выводим полученное значение 
  strcpy(mas_Z[kodS-1].FIO, Stroka);   // Присваиваем полученное значение элементу структуры 
  cout << mas_Z[kodS-1].FIO  << endl; // Проверяем
}
for (i=0; i < kol; i++){
   fwrite(&mas_Z[i], size, 1, Fz);  // Записываем структуру в файл 
}

В строке cout << mas_Z[kodS-1].FIO << endl; выводится новое значение. Но если выводить целиком структуру или записывать в файл, то ничего не сохраняется.

Вопрос

Почему fwrite, не записывает в файл новое значение элемента структуры? Как можно это исправить и изменить данные в структуре с записью в файл?

Answer 1

Файл у вас открывается с флагами "r+b" в режиме для чтения, для записи еще необходим флаг w. Результаты вызова fread и fwrite не проверяются, что является ошибкой.

READ ALSO
C++ Как сравнить два массива типа char?

C++ Как сравнить два массива типа char?

Нужно ввести группуДалее перебрать структура, найти запись с совпадающей группой и вывести её

135
Ошибка с OpenAL. no saved enable hardware sample rate converter preference found

Ошибка с OpenAL. no saved enable hardware sample rate converter preference found

Работаю на Mac, использую XcodeЯ решил попробовать поработать с библиотекой alut

211
WinApi MoveFile - корректное слияние двух папок

WinApi MoveFile - корректное слияние двух папок

Подскажите как корректно слить две папки

131
Посимвольный вывод в консоль

Посимвольный вывод в консоль

Требуется посимвольно выводить строку в консоль

141