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

files and Arrays in C


cherie

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

Δημοσ.

Καλησπέρα! Έιμαι καινουργία εδώ και θα ήθελα αν γίνεται τη βοήθεια σας. Προσπαθώ να κάνω κάτι προγραμματάκια σε C αλλά έχω κολλήσει. Το ζητούμενο είναι να διαβάσω ένα .txt αρχείο με αριθμούς σε δυο στήλες, να αποθηκεύσω τους αριθμούς σ΄ενα δυσδιάστατο πίνακα και μετά να τον ταξινομήσω.

 

Διαβάζω το αρχείο, παίρνω τους αριθμούς αλλά όταν προσπαθώ να τους αποθηκέυσω σε πίνακα κάτι γίνεται λάθος και αντί για πίνακα δύο διαστάσεων, όταν το εκτυπώνω εκτυπώνονται όλα σε μια σειρά.

 

Μήπως μπορεί να με βοηθήσει κάποιος? Σας ευχαριστώ εκ των προτέρων!:-)

Δημοσ.

Ναι.. τον κώδικα για τον πίνακα δυο διαστάσεων δεν τολμώ να τον εμφανίσω γιατί είμαι σίγουρη πως έχω κάνει βλακεία! Ο κώδικας που διαβάζει ένα αρχείο και αποθηκέυει τα στοιχεία του σε μονοδιάστατο πίνακα είναι αυτός.

 

#include <stdio.h>

#include <stdlib.h>

 

#define SIZE 10

 

int main()

{

FILE *fp;

 

int array,a=0,b=0;

char filename [20];

 

printf("\n Enter your filename:");

gets(filename);

 

if ((fp=fopen(filename,"r"))!= NULL)

{

printf("\n file %s opens in mode r.\n",filename);

}

else{

fprintf(stderr,"Error in Opening File %s.",filename);

//exit(1);

}

 

while(!feof(fp)) {

fscanf(fp, "%d", &array[a]);

a++;

}

 

printf("The numbers are:\n");

for(b=0 ; b<a ; b++) {

printf("%d\n", array);

}

 

fclose(fp);

return 0;

}

 

Τι να αλλάξω για να τα αποθηκέυω σε δυσδιάστατο πίνακα? Δοκίμασα με δυο for αντί της feof και αποθήκευση στον πίνακα που θέλω αλλά προφανώς είναι λάθος.

Δημοσ.

Δεν μπορώ να καταλάβω τι λες.

 

Αυτό;

>
while(!feof(fp)) {
fscanf(fp, "%d", &array[0][a]);

fscanf(fp, "%d", &array[1][a]);

a++;

}


>
και μετά

for(x=0;x<a;x++)
{
 printf (%d",array[0][x]);
 printf ("%d\n",array[1][x]);
}

 

Ελπίζω να μην βγήκα εκτός θέματος και να λεο μαλακίες.

Δημοσ.

Οπότε τελικά:

 

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

#define SIZE 10

int
main (int argc, char *argv[])
{
 FILE *fp;

 int array[2][size], a = 0, b = 0, x = 0;
 char filename[20];

 printf ("\n Enter your filename:");
 gets (filename);

 if ((fp = fopen (filename, "r")) != NULL)
   {
     printf ("\n file %s opens in mode r.\n", filename);
   }
 else
   {
     fprintf (stderr, "Error in Opening File %s.", filename);
//exit(1);
   }

 while (!feof (fp))
   {
     fscanf (fp, "%d", &array[0][a]);

     fscanf (fp, "%d", &array[1][a]);

     a++;

   }

 printf ("The numbers are:\n");
 for (x = 0; x < a; x++)
   {
     printf ("%d  ", array[0][x]);
     printf ("%d\n", array[1][x]);
   }


 fclose (fp);
 return 0;
}

 

Αν είναι αυτό που θές μετά τι sort θές να κάνεις;

Δημοσ.

Ευχαριστώ πάρα πολύ για τη βοήθεια!!Ναι περίπου αυτό ήθελα! Το είχα κάνει λίγο διαφορετικά με χρήση for κ έκανα λάθος στην εκτύπωση απ΄ότι αποδείχτηκε.. Η λύση σου μ΄αρέσει περισσότερο όμως οπότε θα την κοιτάξω κ αύτην! Μετά θέλει ταξινόμηση με βάση τη δεύτερη στήλη οπότε θα χρησιμοποιήσω φυσαλίδα για τη δεύτερη στήλη μόνο. Νομίζω πως το έχω αν κ όλο και κάποια βλακέια θα κάνω πάλι!

Δημοσ.

Αρχικά αν θέλεις ένα δυσδιάστατο πίνακα στην C θα πρέπει να τον δηλώσεις ως εξής:

 

int nArray[nrRows][nrCols];

 

Κατόπιν το while που έχεις χρησιμοποιήσει δεν μου αρέσει. Αυτό το feof δεν είναι και ότι καλύτερο, αν διαβάσεις το man page της feof θα καταλάβεις ότι δεν είναι και η καλύτερη συνάρτηση για να παίζεις με τα αρχεία. Προτίμησε κάτι του τύπου:

 

while(fscanf() != nrElementsRead && Index < nrRows)

 

με την fscanf να περνάει τα στοιχεία που διαβάζει στον δυσδιάστατο πίνακα και μέσα στο σώμα της while να αντιμετωπίζεις τις αυξομετρήσεις των μετρητών μεταβλητών του πίνακα.

 

Επίσης ξέρεις apriori το σύνολο των στοιχείων που θα διαβάσεις; Ίσως θα πρέπει να κινηθείς δυναμικά εδώ, απελευθέρωσε στο τέλος την μνήμη για να μην έχεις memory leaks και μην ξεχάσεις να κλείσεις το αρχείο. Αν κολλήσεις θα σου γράψω λίγο κώδικα.

 

Bokarinho.

Δημοσ.
Αρχικά αν θέλεις ένα δυσδιάστατο πίνακα στην C θα πρέπει να τον δηλώσεις ως εξής:

 

int nArray[nrRows][nrCols];

 

Κατόπιν το while που έχεις χρησιμοποιήσει δεν μου αρέσει. Αυτό το feof δεν είναι και ότι καλύτερο, αν διαβάσεις το man page της feof θα καταλάβεις ότι δεν είναι και η καλύτερη συνάρτηση για να παίζεις με τα αρχεία. Προτίμησε κάτι του τύπου:

 

while(fscanf() != nrElementsRead && Index < nrRows)

 

με την fscanf να περνάει τα στοιχεία που διαβάζει στον δυσδιάστατο πίνακα και μέσα στο σώμα της while να αντιμετωπίζεις τις αυξομετρήσεις των μετρητών μεταβλητών του πίνακα.

 

Επίσης ξέρεις apriori το σύνολο των στοιχείων που θα διαβάσεις; Ίσως θα πρέπει να κινηθείς δυναμικά εδώ, απελευθέρωσε στο τέλος την μνήμη για να μην έχεις memory leaks και μην ξεχάσεις να κλείσεις το αρχείο. Αν κολλήσεις θα σου γράψω λίγο κώδικα.

 

Bokarinho.

 

Ευχαριστώ πάρα πάρα πολύ για τις υποδείξεις! Η feof ήταν το πιο απλό που μπορούσα να σκεφτώ αν κ απ΄ότι βλέπω όχι η καλύτερη επιλογή τελικά. Κοίταξα και τα υπόλοιπα που μου είπες και πιστεύω πως τώρα είναι εντάξει. Ας μην είναι και τέλειο δεν πειράζει! Ευχαριστώ και πάλι πάρα πολύ!:-)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

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