Jump to content



Ανάγνωση αρχείων στη c


scoobydoo

Recommended Posts

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

///////// 0 100 200 300 400

///////// 1 0,8 0,5 0,2 0

17 0,1

19 1

21 0,5

23 0,2

25 0

28 0

30 0

32 0

Ευχαριστώ πολύ.

Link to comment
Share on other sites

Σε 1 πίνακα μόνο αν είναι δισδιάστατος με στήλες όσες είναι το μέγιστο πλήθος των στοιχείων που περιέχονται στις 2 πρωτες γραμμές του txt και γραμμές όσες είναι οι γραμμές και του txt.Καλύτερα να το κάνεις με 2 πίνακες.

Link to comment
Share on other sites

Η διατύπωση σου δεν βοηθάει πολύ. Το παρακάτω είναι μια ενδεικτική μορφή του αρχείου;

///////// 0 100 200 300 400

///////// 1 0,8 0,5 0,2 0

17 0,1

19 1

21 0,5

23 0,2

25 0

28 0

30 0

32 0

Προφανώς θέλεις δύο δισδιάστατους πίνακες (?) γιατί καταλαβαίνω ότι είναι διαφορετικών διαστάσεων. Δεν είπες επίσης τι είδους συγκρίσεις θέλεις να κάνεις. Για παράδειγμα κάποιος αλγόριθμος sort μπορεί να σε βοηθούσε; Θέλεις να βρίσκεις το μέγιστο από δύο στοιχεία των πινάκων;

Aφού ανοίξεις το stream μπορείς να πάρεις τα δεδομένα με αρκετούς τρόπους (fscanf ή strtok και fseek) ανάλογα με το layout του αρχείου. Με τα αντίστοιχα loops γεμίζεις τους πίνακες και τέλος κάνεις τις συγκρίσεις που θέλεις. Θα μπορούσα να σου γράψω ένα κορμό αν είχα μια καλύτερη εικόνα, π.χ. στείλε ένα ενδεικτικό αρχείο και το πως θα είναι ταξινομημένα τα δεδομένα του στους πίνακες.

Link to comment
Share on other sites

Η διατύπωση σου δεν βοηθάει πολύ. Το παρακάτω είναι μια ενδεικτική μορφή του αρχείου;

Προφανώς θέλεις δύο δισδιάστατους πίνακες (?) γιατί καταλαβαίνω ότι είναι διαφορετικών διαστάσεων. Δεν είπες επίσης τι είδους συγκρίσεις θέλεις να κάνεις. Για παράδειγμα κάποιος αλγόριθμος sort μπορεί να σε βοηθούσε; Θέλεις να βρίσκεις το μέγιστο από δύο στοιχεία των πινάκων;

Aφού ανοίξεις το stream μπορείς να πάρεις τα δεδομένα με αρκετούς τρόπους (fscanf ή strtok και fseek) ανάλογα με το layout του αρχείου. Με τα αντίστοιχα loops γεμίζεις τους πίνακες και τέλος κάνεις τις συγκρίσεις που θέλεις. Θα μπορούσα να σου γράψω ένα κορμό αν είχα μια καλύτερη εικόνα, π.χ. στείλε ένα ενδεικτικό αρχείο και το πως θα είναι ταξινομημένα τα δεδομένα του στους πίνακες.

Στον πίνακα που βλέπεις κάτι τέτοιο θέλω να κάνω. Τα στοιχεία στο κίτρινο και το ροζ θα τα εισάγω από το αρχείο, είναι όπως τα στοιχεία που ανέφερα παραπάνω. Μετά θα έχω συγκρίσεις των στοιχείων που είναι στα ροζ κουτάκια. Δηλαδή όπως είναι ο πίνακας το 0 με το 0 και βρίσκω το ελάχιστο και μπαίνει στο πρώτο άσπρο κουτάκι, μετά το 0 με το 0,2 και μπαίνει το 0 και πάει έτσι και συμπληρώνεται ο πίνακας.

Ευχαριστώ πολύ!

post-23512-1416076055,4665_thumb.jpg

Link to comment
Share on other sites

Fuzzy Logic μου μυρίζεται και δεν μπορώ ακόμα να κατάλαβω αν αυτό είναι άσκηση για τη C ή για τεχνητή νοημοσύνη. Δλδ σας είπανε να το κάνετε αποκλειστικά σε πρόγραμμα C; Μια παρουσίαση με Excell δεν θα ήταν πολύ πιο βολική;

Τέσπα, όπως το βλέπω τελικά, θέλει τρεις δισδιάστατους πίνακες (όπως θέλεις γίνεται απλά εγώ έτσι θα το κανα - αν έπρεπε να χρησιμοποιήσω αναγκαστικά πίνακες). Ένα για τα δεδομένα T και τα βάρη τους, έναν για τα δεδομένα D και τα βάρη τους και ο τρίτος για να αποθηκεύονται τα αποτελέσματα από το Mandani Min.

To πρόβλημα σου είναι ότι δεν μπορείς να ανοίξεις το αρχείο και να περάσεις τις τιμές στους πίνακες;

ΥΓ. Το μέγεθος των πινάκων είναι σταθερό ή άγνωστο (π.χ. εξαρτάται από το πλήθος των δεδομένων στο αρχείο);

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

Link to comment
Share on other sites

Fuzzy Logic μου μυρίζεται και δεν μπορώ ακόμα να κατάλαβω αν αυτό είναι άσκηση για τη C ή για τεχνητή νοημοσύνη. Δλδ σας είπανε να το κάνετε αποκλειστικά σε πρόγραμμα C; Μια παρουσίαση με Excell δεν θα ήταν πολύ πιο βολική;

Τέσπα, όπως το βλέπω τελικά, θέλει τρεις δισδιάστατους πίνακες (όπως θέλεις γίνεται απλά εγώ έτσι θα το κανα - αν έπρεπε να χρησιμοποιήσω αναγκαστικά πίνακες). Ένα για τα δεδομένα T και τα βάρη τους, έναν για τα δεδομένα D και τα βάρη τους και ο τρίτος για να αποθηκεύονται τα αποτελέσματα από το Mandani Min.

To πρόβλημα σου είναι ότι δεν μπορείς να ανοίξεις το αρχείο και να περάσεις τις τιμές στους πίνακες;

ΥΓ. Το μέγεθος των πινάκων είναι σταθερό ή άγνωστο (π.χ. εξαρτάται από το πλήθος των δεδομένων στο αρχείο);

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

Fuzzy Logic είναι. Δεν μας είπαν αποκλειστικά να χρησιμοποιήσουμε C. Με όποια γλώσσα προγραμματισμού θέλουμε να το κάνουμε. Γίνεται με κάποια άλλη γλώσσα πιο εύκολα?Υπάρχει κάτι έτοιμο για να χρησιμοποιήσω?Σκέφτηκα με πίνακες στη c, γιατί έχω περισσότερη εξοικείωση. Αυτό που με δυσκολεύει είναι το πως θα διαβάσω από το αρχείο τα δεδομένα μου και θα τα περάσω σε πίνακες. Στο αρχείο τα δεδομένα μου standar θα είναι. Όταν λες παρουσίαση σε excel τι εννοείς?

Ευχαριστώ

Link to comment
Share on other sites

Για αναγνωση γραμμών απο txt αρχειο

Code: Reading a Text File One Line at a Time (Visual C#)

Διαχωρισμός ενός string με βάση ένα χαρακτήρα για να παρεις τα δεδομένα απο τις γραμμές του αρχειου που τα έχουν οριζόντια

String.Split Method (System)

Δομή δεδομένων με ζεύγη της μορφής (Κey,Value) μεταβλητού μεγέθους

Dictionary(TKey, TValue) Class (System.Collections.Generic)

Αναδρομή

foreach, in (C#)

Είναι σε C#

Link to comment
Share on other sites

Mήπως μπορείς να μου στείλεις κάτι για να ξεκινήσω?Γιατί έχω δυσκολευτεί αρκετά με αυτό και δεν μπορώ να βρω κάτι για να ξεκινήσω...

Αυτό θα με βοηθούσε πάρα πολύ..

Ευχαριστώ

[C] thelabbbbb - Pastebin.com

Ενδεικτικό αρχείο (με όνομα test.txt!):

1 2 3 4
5 6 7 8 9 10
2.5 3.204 1
1

5


Και το αντίστοιχο output:

-----------
LINE 1
------------
READ NUMBER 1.000000 !
READ NUMBER 2.000000 !
READ NUMBER 3.000000 !
READ NUMBER 4.000000 !
-----------
LINE 2
------------
READ NUMBER 5.000000 !
READ NUMBER 6.000000 !
READ NUMBER 7.000000 !
READ NUMBER 8.000000 !
READ NUMBER 9.000000 !
READ NUMBER 10.000000 !
-----------
LINE 3
------------
READ NUMBER 2.500000 !
READ NUMBER 3.204000 !
READ NUMBER 1.000000 !
-----------
LINE 4
------------
READ NUMBER 1.000000 !
-----------
LINE 5
------------
-----------
LINE 6
------------
READ NUMBER 5.000000 !
-----------
LINE 7
------------
-----------
LINE 8
------------

Link to comment
Share on other sites

[C] thelabbbbb - Pastebin.com

Ενδεικτικό αρχείο (με όνομα test.txt!):

1 2 3 4
5 6 7 8 9 10
2.5 3.204 1
1

5


Και το αντίστοιχο output:

-----------
LINE 1
------------
READ NUMBER 1.000000 !
READ NUMBER 2.000000 !
READ NUMBER 3.000000 !
READ NUMBER 4.000000 !
-----------
LINE 2
------------
READ NUMBER 5.000000 !
READ NUMBER 6.000000 !
READ NUMBER 7.000000 !
READ NUMBER 8.000000 !
READ NUMBER 9.000000 !
READ NUMBER 10.000000 !
-----------
LINE 3
------------
READ NUMBER 2.500000 !
READ NUMBER 3.204000 !
READ NUMBER 1.000000 !
-----------
LINE 4
------------
READ NUMBER 1.000000 !
-----------
LINE 5
------------
-----------
LINE 6
------------
READ NUMBER 5.000000 !
-----------
LINE 7
------------
-----------
LINE 8
------------

Ευχαριστώ πολυ. Θέλω επίσης, αυτά τα δεδομένα που διαβάζω να μπαίνουν σε πίνακες και θέλω σε 2 χωριστούς πίνακες. Αυτό πως θα το υλοποιήσω?Μπορείς να φτιάξεις κάτι τέτοιο να δω πως γίνεται?Σε ευχαριστώ πάρα πολύ για τη βοήθεια!

Link to comment
Share on other sites

Ευχαριστώ πολυ. Θέλω επίσης, αυτά τα δεδομένα που διαβάζω να μπαίνουν σε πίνακες και θέλω σε 2 χωριστούς πίνακες. Αυτό πως θα το υλοποιήσω?Μπορείς να φτιάξεις κάτι τέτοιο να δω πως γίνεται?Σε ευχαριστώ πάρα πολύ για τη βοήθεια!

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

Private Paste ID: bPqyZfP7

όπου στο παρακάτω σημείο..

if (1){
puts("Stored number in array A!");
arrayA[a++] = currentNumber;
} else {
puts("Stored number in array B!");
arrayB[b++] = currentNumber;
}

.. αντικαθιστάς το if (1) με το δικό σου έλεγχο, προφανώς, ο οποίος θα ρυθμίζει σε ποιο πίνακα αντιγράφεται η τιμή.

edit:

Όπως θα δεις, οι πίνακες είναι στατικοί, με χωρητικότητα που καθορίζεται στην αρχή (στα defines).

Αν θέλεις δυναμικούς πίνακες, παίξε με malloc/realloc.

Link to comment
Share on other sites

Ενδεικτικό αρχείο (με όνομα test.txt!):

1 2 3 4
5 6 7 8 9 10
2.5 3.204 1
1

5


Δεν του κάνει ένας τέτοιου τύπου αρχείου. Έχει να κάνει με ασαφή λογική και θέλει συγκεκριμένα δεδομένα μαζί με τα βάρη τους (χοντρικά θα πρέπει μετά να συγκρίνει τα βάρη μεταξύ τους και το μικρότερο να το κρατάει σε ένα πίνακα). Π.χ. για το συννημένο που έβαλε ποιο πάνω θα πρέπει να ήταν:


0 2 5 8 10
0 0,2 0,5 0,8 1
37 0
37,5 0
38 0,2
38,5 0,5
39 0,8
39,5 1
40 1

Ένας κώδικας που έγραψα για ένα τέτοιου τύπου αρχείο (τον έγραψα στο πόδι, δεν έχει περάσει compile, έχει λάθη αν τον περάσεις εσύ όμως compile θα τα διορθώσεις εύκολα νομίζω) θα μπορούσε να ήταν ο εξής:


#include <string.h>
#include <stdlib.h>

#define D_LENGTH 5 //to plithos twn D
#define T_LENGTH 7 //to plithwn twn T




int main(void){

FILE *fp;
char *line, *token;
double tblD[D_LENGTH][2], tblT[T_LENGTH][2], mandani[D_LENGTH][T_LENGTH];
int i,j=0;


fp = fopen("mandani.txt","r");

//Gemizoume tous duo pinakes tlbD k tlbT apo to arxeio
while (fgets(line, MAX_LINE_LEN, fp) != NULL){

i=0;

if(j<2){
token = strtok(line, ' ');
while( token!=NULL){
tlbD[i][j] = atof(token);
i++;
token = strtok( NULL, ' ');
}
j++;
}else{
token = strtok(line, ' ');
while( token!=NULL){
tlbT[j-2][i] = atof(token);
i++;
token = strtok( NULL, ' ');
}
J++;
}
}
fclose(fp);

i=0;
j=0;

//Gemizoume ton pinaka mandani. Tropopoihse to an thes Zadeh, Larsen ktl ;)
for(i=0, i<D_LENGTH, i++){
for(j=0, j<T_LENGTH, j++){
if (tlbD[i][1] < tlbT[j][1]){
mandani[i][j] = tlbD[i][1];
}else{
mandani[i][j] = tlbT[i][1];
}
}
}

return 0;
}
#include <stdio.h>

Όπως και να χει προτείνω περισσότερο τη λύση του Excell εφόσον δεν σας ζητήθηκε σε C. Είναι πιο παραμετροποιήσιμο και ευπαρουσίαστο imo. Αν έχεις λίγη υπομονή αύριο θα σου στείλω κάτι αντίστοιχο.:happy:

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

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

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.