Różne czytanie pliku binarnego

0

Witam,
na komputerze z systemem XP x32 ten kod działał mi bez najmniejszego problemu:

#include <stdlib.h>
#include <stdio.h>
#include <conio2.h>

//-----------------------------------
//1. kolory bajery
//2. zmienic sposob wyswietlania (np po 5 uczniow
//3. dodać np. średnią (odliczyc zero) + np. wyswietlac bdb zmiast 5
struct dane
{
        char nazwisko[26];
        char oceny[16];
};
//enum OCENY {zwol,ndst,dop,dost,db,bdb,cel}; 
enum {NIE=0, LICZBOWO=0, TAK=1, SLOWNIE=1};
char *sciezka="kl1e.dat";
FILE *plik;
int n=16;
int ile;
bool sposob_pokazania=0;
struct dane osoba;
char *przedmioty[16]={"jP","jA","jN","jF","HS","WS","MT","FZ","CH","BL","GF","IF","EB","WF","WK","PP"};
char *oceny[7]={"zw","nd","dp","dt","db","bd","cl"};
int dl_pliku()
{
    fseek(plik,0,2); //ustawia kursor na zerowym miejscu 2 - liczac od konca = na koncu
    return ftell(plik); // okreslenie numeru polozenia glowicy
}
void kartka()
{
     for(int i=0;i<n;i++)
     {
             gotoxy(28+i*3,3);
             printf("%s",przedmioty[i]);
     }
             
}
int il_rekordow()
{
     return dl_pliku()/sizeof(osoba);
 }
 void piatka_uczniow(int pierwszy)
 {
 clrscr();
      for(int j=0;j<5;j++)
      {
              
              fseek(plik, (pierwszy+j)*sizeof(osoba),0);
              fread(&osoba,sizeof(osoba),1,plik);
              osoba.nazwisko[25]='\0';
              gotoxy(1,5+j);
              printf("%s",osoba.nazwisko);
              kartka();
              for(int i=0;i<n;i++) 
              {
                gotoxy(28+i*3,5+j);
                if(sposob_pokazania==SLOWNIE)
                    printf("%s",oceny[osoba.oceny[i]]);
                else
                    printf("%d",osoba.oceny[i]);
              }
      }
}
void pokaz()
{
    // clrscr();
     int kt=16;
     char zn=0;
     plik=fopen(sciezka,"rd");
     ile=il_rekordow();
     gotoxy(1,1);
     printf("plik kl1e.dat %d b.\n",dl_pliku);
     gotoxy(1,2);
     printf("plik kl1e.dat %d b.",il_rekordow);
     piatka_uczniow(kt);
     while(zn!=27)
     {
                  zn=getch();
                  switch(zn)
                  {
                            case 72: kt--; break;
                            case 80: kt++; break;
                  }
                  if(kt>ile-1)
                              kt=0;
                  if(kt<0) kt=ile-1;
                  piatka_uczniow(kt);
     }
     
     fclose(plik);
 }
void zapytanie()
{
     char odp;
     clrscr();
     printf ("Czy chcesz wyswietlic oceny slownie? (y/n)\n");
     odp=getchar();
     sposob_pokazania=LICZBOWO;
     if(odp=='y')
       sposob_pokazania=SLOWNIE; 
}         
int main(int argc, char *argv[])
{
    zapytanie();
    pokaz();
    getch();
    return 0;
}

tak, kod jest celowo stylizowany na C
ale po skopiowaniu tego pliku i pliku binarnego na komputer domowy Vista x64 plik kompiluje się ale we wszystkich polach wpisane jest "zw" (odpowiadające wartości 0) oraz nie wyświetlają się nazwiska

czego zapomniałem zmienić?

0

Prawdopodobnie przyczyną jest struct alignment.

Przed strukturą daj #pragma pack(push, 1), a po #pragma pack(pop) - przynajmniej w VS tak te dyrektywy działają

0

Możesz też zmienić format pliku binarnego.
Lub rozszerzyć rozmiar tablicy ocen do 38 (może nie na każdym kompilatorze zadziałać).

0

byku: nic z tego
dragon: nie wiem po co miałbym rozszerzać tablice ocen do 38

a gdybym przemianował tego structa na klase?

PS na obu kompach używam dev'a, w sumie moge odpalić eclipse albo code blocksa ale nie chciało mi sie do tej pory

edit:
po sprawdzeniu reszty programu, jedyne co nie działa to te structy

#pragma pack(push, 1)
struct dane
{
        char nazwisko[32]; //26
        char oceny[32]; //16
};
#pragma pack(pop) 

1 użytkowników online, w tym zalogowanych: 0, gości: 1