Προς το περιεχόμενο

Τι κάνω λάθος;; (Διάβασμα από δυαδικό αρχείο στη C)


Dinos_12345

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα παίδες, προσπαθώ να διαβάσω από δυαδικό αρχείο στη C και μου κρασάρει το πρόγραμμα. Καμιά ιδέα; Το πρόγραμμα αρχικοποιεί ένα array, N θέσεων με ψευδοτυχαίους αριθμούς από 30 μέχρι 50, εξού και τα OA, OB. Η συνάρτηση read_file επιστρέφει το μέγεθος του array που διάβασε.

int main(){
  int OA=30;
  int OB=50;
  int *A;
  int *size;
  array_prep(A,size,OA,OB);
  MENU(A,size,OA,OB);
  system("pause");
  return 0;
} 
int array_prep(int* array,int size,int OA,int OB){
  int choice;
  printf("What do you want to do?\n\n1. Create new array\n2. Load array from file\n" );
  scanf("%d",&choice);
  fflush(stdin);
  while(choice!=0){
    if(choice==1){
      printf("Give the size of the array");
      scanf("%d",&size);
      printf("1");
      array=mkArray(size,OA,OB);
      choice=0;
    }
    else if(choice==2){
      printf("Give the filename\n");
      char filename[30];
      gets(filename);
      int size=read_file(filename,&array);
      choice=0;
    }
  }
}
int read_file(char *FN, int **NewMat){
  int NN;
  FILE *fp;
  fp=fopen(FN,"rb");
  if(fp==NULL) return 0;
  fseek(fp,0,SEEK_END);
  NN=ftell(fp)/sizeof(int);
  *NewMat=(int*)malloc(NN*sizeof(int));
  fseek(fp,0,SEEK_SET);
  fread(*NewMat,sizeof(int),NN,fp);
  fclose(fp);
  return NN;
}
Επεξ/σία από Dinos_12345
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 77
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Όταν ανοίγεις το αρχείο παίρνεις τη θέση του δρομέα π.χ. το 1 και διαιρείς με το μέγεθος του ακεραίου. Άρα παίρνεις 0 στο ΝΝ..

Πρόσεξα ότι πας στο τέλος. Λογικά θα πάει στη επόμενη μη υπαρκτή θέση, αλλά θα έχει μονό νούμερο, πρέπει να αφαιρέσεις 1 για να βγεί ζυγό και να το διαιρέσεις με το μέγεθος του ακεραίου...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όταν ανοίγεις το αρχείο παίρνεις τη θέση του δρομέα π.χ. το 1 και διαιρείς με το μέγεθος του ακεραίου. Άρα παίρνεις 0 στο ΝΝ...

Αφού ο fp την στιγμη που τον διαιρώ δείχνει στο τέλος του αρχείου. Το πρόβλημα πρέπει να είναι στην array_prep. Τελικά κατάφερα να το κάνω να μην κρασάρει αλλά όταν βγεί από την array_prep δεν μου έχει κάνει τίποτα στο array A. Δηλαδή τον τυπώνω και είναι κενός, και στις 2 περιπτώσεις της array_prep.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λογικά δεν δείχνει στο τέλος του αρχείου αλλά στο πρώτο byte που θα γράψει, και δεν υπάρχει! (για να γίνει το append, αν με το seek πήγαινες στο τελευταίο byte θα έπρεπε να δώσεις άλλη μια εντολή να πάει ένα byte ακόμα).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βάζε μερικές printf για να καταλάβεις που κολλάει, και τι νούμερα έχεις μέχρι εκεί

Μήπως να έβαζες το ΝΝ να το διαβάζει από το αρχείο;

Αν ήταν txt ναι θα βόλευε, αλλά έστω ότι το λύσαμε αυτό, ούτε η πρώτη περίπτωση του array_prep δουλεύει

Αν δεις στη main, δηλώνω pointer σε integer για το size και περνάω integer στην συνάρτηση, which is stupid, αλλά είναι η μόνη περίπτωση που δεν κρασάρει.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ωχ έγινε μαντάρα το προηγούμενο μήνυμα! σβήστηκε και αλλάχτηκε...αλλά διάβασε το καινούργιο!


 

http://www.codingunit.com/c-tutorial-binary-file-io

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έχω μια απορία. Την mkArray την οποία χρησιμοποιείς μέσα στην array_Prep, που τη δηλώνεις ?

int mkArray(int size,int OA,int OB){
  int *array=(int *)malloc(sizeof(int)*size);
  FillArray(array,size,OA, OB);
  return array;
}
int MyRand(int OA, int OB){
     int diff = OB-OA;
     int randnum = rand()%diff+OA;
     return randnum;
}
int FillArray(int* A,int size,int OA, int OB){
  for (int i=0;i<size;i++){
    *(A+i)=MyRand(OA,OB);
  }
}

βγάλε το αστεράκι από την NewMat στην Fopen

 

http://stackoverflow.com/questions/22059189/read-a-file-as-byte-array

Δεν είναι το πρόβλημα η συνάρτηση, ξαναλέω πως ούτε η επιλογή 1 γεμίζει τον πίνακα...

Edit: Γεμίζει τους πίνακες κανονικότατα αλλά δεν τους στέλνει πίσω στη main, με 1 loop για να τυπώσω τον πίνακα κάτω από τις δύο επιλογές, μου εμφάνισε ακριβώς ότι έπρεπε.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στην array_prep πέρνα pointer σε pointer σε int.

 

Τον αφήνεις ως έχει στην main. Τον περνάς με & στην συνάρτηση. Λογικά (θα) σου χτυπάει και η MENU.

 

Να φανταστώ ότι στην MENU τυπώνεις;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στην array_prep πέρνα pointer σε pointer σε int.

 

Τον αφήνεις ως έχει στην main. Τον περνάς με & στην συνάρτηση. Λογικά (θα) σου χτυπάει και η MENU.

 

Να φανταστώ ότι στην MENU τυπώνεις;

Ναι η menu είναι η διεπαφή με το χρήστη, δεν χτυπάει τίποτα... pointer σε pointer int? Σε τι;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

Επίσης η fread σου επιστρέφει τον αριθμό των στοιχείων που διάβασες.

Στην συνάρτηση array-prep. Περνάς την μεταβλητή Α. Όταν τελείωσει η array_prep η τιμή της Α θα είναι αυτή που είχε μέσα στην main. Όχι αυτή που απέκτησε στην συνάρτηση.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επίσης η fread σου επιστρέφει τον αριθμό των στοιχείων που διάβασες.

Στην συνάρτηση array-prep. Περνάς την μεταβλητή Α. Όταν τελείωσει η array_prep η τιμή της Α θα είναι αυτή που είχε μέσα στην main. Όχι αυτή που απέκτησε στην συνάρτηση.

Η Α είναι pointer στο πρώτο στοιχείο του πίνακα. Το όνομα του πίνακα, εξ'ορισμού δεν είναι pointer στο πρώτο στοιχείο του;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επίσης κάνε ένα test. Δες την διεύθυνση του πίνακα όταν τον γεμίζεις (όπου λειτουργεί ο κώδικάς σου) και σύγκρινέ την με την τιμή της μεταβλητής Α αμέσως πριν το πρόγραμμά σου μπει στην MENU.

 

Σου λέω από τώρα ότι θα είναι διαφορετικές διευθύνσεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...