Kate30 Δημοσ. 13 Ιανουαρίου 2018 Δημοσ. 13 Ιανουαρίου 2018 Καλησπέρα! Ασχολούμαι εδώ και λίγο καιρό με γλώσσα C και θα ήθελα να μάθω πως μπορώ να διαβάσω έναν πίνακα ο οποίος βρίσκεται σε αρχείο .txt Έχω ψάξει σε tutorials και γενικότερα στο internet και δεν έχω βρει κάτι σχετικό... Χρειάζομαι σε πρώτη φάση έναν εύκολο/απλό τρόπο αν γίνεται (χωρίς δείκτες , δυναμική δέσμευση και πιο πολύπλοκα πραγματάκια) για να το καταλάβω (λόγω της μικρής μου εμπειρίας) ***Θα με βοηθούσε πολύ ένα απλό παραδειγματάκι με πίνακα integer 3*3
Moderators Kercyn Δημοσ. 13 Ιανουαρίου 2018 Moderators Δημοσ. 13 Ιανουαρίου 2018 Λοιπόν, αυτή τη στιγμή έχω 4 στα 9 bingo, αλλά πιστεύω μπορούμε και καλύτερα. Δείξε μας τι έχεις κάνει μέχρι τώρα και πού κολλάς ακριβώς.
Ilias95 Δημοσ. 13 Ιανουαρίου 2018 Δημοσ. 13 Ιανουαρίου 2018 Δοκίμασε να το σπάσεις σε επιμέρους μικρά βήματα και κάντο σιγά σιγά. Π.χ. αρχικά, δοκίμασε να ανοίξεις ένα οποιοδήποτε text αρχείο, να το διαβάζεις γραμμή, γραμμή και να το εκτυπώνεις. Μετά πρέπει να ξέρεις πως ακριβώς θα είναι αποθηκευμένος ο "πίνακας" στο αρχείο. Θα είναι πχ. κάθε γραμμή του αρχείου και γραμμή του πίνακα με τα στοιχεία χωρισμένα με κενό (ή κόμμα ή τι); Αν ναι, ξέχνα τότε για λίγο το αρχείο, φτιάξε με το χέρι ένα string που να αναπαριστά μια γραμμή του αρχείου (πχ. char *line = "32 46 32";) και γράψε μια συνάρτηση που να παρσάρει το string και να αποθηκεύει τα στοιχεία κάπου. Επίσης ένα ακόμα ξεχωριστό μικρό πρόβλημα είναι πως θα μετατρέψεις ένα string που αναπαριστά έναν ακέραιο σε int. Όλα αυτά θα τα βρεις εύκολα με λίγο googling, το μόνο που χρειάζεται να σκεφτείς για να γράψεις είναι την συνάρτηση που θα παρσάρει κάθε γραμμή του αρχείου. Αν ξέρεις τις διαστάσεις του πίνακα εκ των προτέρων είναι πιο εύκολο. Αλλιώς αναγκαστικά θα χρειαστεί να δεσμεύσεις μνήμη δυναμικά.
Kate30 Δημοσ. 15 Ιανουαρίου 2018 Μέλος Δημοσ. 15 Ιανουαρίου 2018 Καταρχήν , ευχαριστώ για την απάντηση! Ξεκίνησα να γράφω κώδικα για την εφαρμογή που θέλω να φτιάξω και νομίζω ότι στην περίπτωση μου ισχύει "Νοw I have more than two problems !" Έχω κολλήσει σε δύο σημεία...(χωρίς ακόμα να έχω προσπαθήσει το διάβασμα από αρχείο txt) Στην ουσία θέλω να φτιάξω ένα σύνολο δεδομένων με struct. Ένα στιγμιότυπο του struct περιλαμβάνει 3 δεδομένα : mold_type (συμβολοσειρά) box_type (συμβολοσειρά) box_capacity (ακέραιος) θέλω να εισάγω από το πληκτρολόγιο το mold_type και ανάλογα με αυτό που εισάγω να μου υπολογίζει κάποια πραγματάκια με βάση τα αντίστοιχα box_type και box_capacity # include <stdio.h> # define STRING_SIZE 30 # define SIZE 4 struct mold_data { char mold_type[STRING_SIZE]; char box_type[STRING_SIZE]; int box_capacity; }; struct mold_data array[SIZE]; main() { int quantity; float num_of_boxes; char mold_inserted[STRING_SIZE]; struct mold_data array[1] = {"jetb12","No1",12000}; struct mold_data array[2] = {"dets10","No3",5000}; struct mold_data array[3] = {"jeto185","No6",1000}; struct mold_data array[4] = {"500grlid","No2",24000}; printf("Type mold type"); scanf("%s",mold_inserted[STRING_SIZE]); printf("Type ordered quantity"); scanf("%d",quantity); if (mold_inserted[STRING_SIZE]=array[1].mold_type) { num_of_boxes=quantity/array[1].box_capacity; printf("%f" "%s",num_of_boxes,array[1].box_type); } else if (mold_inserted[STRING_SIZE]=array[2].mold_type) { num_of_boxes=quantity/array[2].box_capacity; printf("%f" "%s",num_of_boxes,array[2].box_type); } else if (mold_inserted[STRING_SIZE]=array[3].mold_type) { num_of_boxes=quantity/array[3].box_capacity; printf("%f" "%s",num_of_boxes,array[3].box_type); } else if (mold_inserted[STRING_SIZE]=array[4].mold_type) { num_of_boxes=quantity/array[4].box_capacity; printf("%f" "%s",num_of_boxes,array[4].box_type); } else printf("Moldtype inserted does not exist"); } Μπορεί κάποιος να με βοηθήσει με compiler τα 2 λάθη που βγάζει ο compliler σε αυτή τη φάση??? Σε επόμενη φάση θέλω να βγάλω αυτά τα if και να το κάνω να ψάχνει μέσα στο αρχείο txt που θα είναι κάπως έτσι : jetb12 12000 No1 dets10 5000 No3 jeto185 1000 No6 500grlid 24000 No2 Γενικά θέλω να προσθέσω πολλά πράγματα ακόμη αλλά προς το παρόν προσπαθώ να το κρατήσω απλό και να το χτίζω βήμα-βήμα. Συγνώμη για τα μαργαριτάρια που θα δείτε αλλά είναι ο πρώτος μου κώδικας !!
vel0city Δημοσ. 15 Ιανουαρίου 2018 Δημοσ. 15 Ιανουαρίου 2018 (επεξεργασμένο) @Kate30 Δεν διάβασα τον κωδικα σου, αλλα με μια πολυ γρηγορη ματια φαινεται οτι χρησιμοποιείς τον τελεστη εκχωρησης (=) αντι για τον τελεστη συγκρισης (==) σε ολα τα if σου. Ειναι valid C++ (το τι ακριβως κανει δε σε ενδιαφερει σε αυτη την φαση), αλλα ειμαι 100% σιγουρος οτι δεν θες να κανει αυτο που κανει τωρα ο κωδικας. TL;DR: Αλλαξε τα = σε == οπου εχεις if. Επεξ/σία 15 Ιανουαρίου 2018 από vel0city
imitheos Δημοσ. 16 Ιανουαρίου 2018 Δημοσ. 16 Ιανουαρίου 2018 [offtopic] Ξέρει κανείς πώς κλείνει το άθλιο editor στις απαντήσεις και να τα εμφανίζει ξανά ως απλό κείμενο όπως παλιά ; Στην παλιά έκδοση είχε ένα κουμπί διακόπτη αλλά δεν βλέπω κάτι τώρα. [/offtopic] > struct mold_data array[1] = {"jetb12","No1",12000}; struct mold_data array[2] = {"dets10","No3",5000}; struct mold_data array[3] = {"jeto185","No6",1000}; struct mold_data array[4] = {"500grlid","No2",24000}; if (mold_inserted[STRING_SIZE]=array[1].mold_type) Δεν κοίταξα τι κάνει ο κώδικας αλλά το ένα λάθος που έχεις το επισήμανε ήδη ο velocity. Όταν έχεις μονό = στο if τότε έχεις ανάθεση και όχι έλεγχο. Ο έλεγχος ισότητας γίνεται με διπλό ==. Στην προκειμένη περίπτωση όμως ούτε έτσι θα σου έπαιζε επειδή έχεις δύο πίνακες. Για να ελέγξεις δύο "string" για ισότητα πρέπει να χρησιμοποιήσεις κάποια συνάρτηση που κάνει αυτή στη δουλειά όπως πχ την strncmp. Δεύτερο λάθος είναι τα νούμερα που χρησιμοποιείς στους πίνακες. Όρισες ένα πίνακα με μέγεθος 4 και μετά δίνεις τιμές με [1] - [4]. Από ποιον αριθμό αρχίζει η αριθμοδότηση στην C ? Από εκεί και πέρα, όταν έχεις Ν if - elseif με το σώμα του κώδικα να κάνει την ίδια δουλειά, αυτό φωνάζει για βρόχο. Μπορείς δηλαδή να χρησιμοποιήσεις ένα for αντί να τα γράφεις έτσι. 1
Rurouni89 Δημοσ. 19 Ιανουαρίου 2018 Δημοσ. 19 Ιανουαρίου 2018 (επεξεργασμένο) Μια ιδέα από vb.net Αρχείο text έστω οι τιμές: 1,10,20 2,20,30 3,30,40 Κώδικας αναζήτησης και μεταφοράς του αποτελέσματος σε πίνακα: Dim s As String s = "" Dim path As String = "c:\a.txt" Dim a As Boolean Dim dt As New DataTable dt.Clear() dt.Rows.Clear() dt.Columns.Add("First Number") dt.Columns.Add("Second Number") dt.Columns.Add("Third Number") Dim rw As DataRow Try Dim sr As StreamReader = New StreamReader(path) Do While sr.Peek() >= 0 s = sr.ReadLine() If s = Me.TextBox1.Text & "," & Me.TextBox2.Text & "," & Me.TextBox3.Text Then a = True rw = dt.NewRow() rw("First Number") = Me.TextBox1.Text rw("Second Number") = Me.TextBox2.Text rw("Third Number") = Me.TextBox3.Text dt.Rows.Add(rw) MessageBox.Show(a) Else a = False MessageBox.Show(a) End If Loop sr.Close() Catch ex As Exception Console.WriteLine("The process failed: {0}", ex.ToString()) End Try Me.DataGridView1.DataSource = dt και το παράθυρο: Επεξ/σία 19 Ιανουαρίου 2018 από Rurouni89
Kate30 Δημοσ. 27 Ιανουαρίου 2018 Μέλος Δημοσ. 27 Ιανουαρίου 2018 (επεξεργασμένο) Ευχαριστώ για τις απαντήσεις σας! Μετά από αρκετές αλλαγές που έκανα φαίνεται ότι o compliler δε βρίσκει errors/warnings. Αλλά όταν πάω να το τρέξω κολλάει και συγκεκριμένα όταν εισάγω τη μεταβλητή quantity (π.χ 2.0) και πατάω enter. Επίσης , θα ήθελα να ρωτήσω γιατί πρέπει να χρησιμοποιήσω strcpy όταν αρχικοποιώ τα στοιχεία του struct που είναι strings. To βρήκα κάπου googlάροντας αλλά δεν το καταλαβαίνω. Είχα δοκιμάσει και μια πιο "μαζεμένη" αρχικοποίηση του πίνακα- struct : mold_data array[0] = {"jetb12","No1",12.0}; mold_data array[1] = {"dets10","No3",5.0}; mold_data array[2] = {"jeto185","No6",1.0}; mold_data array[3] = {"500grlid","No2",24.0}; αλλά δε δούλεψε..μου έβγαζε αρκετά errors # include <stdio.h> # include <string.h> # define STRING_SIZE 30 # define SIZE 4 struct mold_data { char mold_type[STRING_SIZE]; char box_type[STRING_SIZE]; float box_capacity; }; struct mold_data array[SIZE]; main() { int i; float quantity; float num_of_boxes; char mold_inserted[STRING_SIZE]; strcpy(array[0].mold_type,"jetb12"); strcpy(array[0].box_type,"No1"); array[0].box_capacity=12.0; strcpy(array[1].mold_type, "dets10"); strcpy(array[1].box_type,"No3"); array[1].box_capacity=5.0; strcpy(array[2].mold_type,"jeto185"); strcpy(array[2].box_type,"No6"); array[2].box_capacity=1.0; strcpy(array[3].mold_type,"500grlid"); strcpy(array[3].box_type,"No2"); array[3].box_capacity=24.0; printf("Type mold type"); scanf("%s",mold_inserted); printf("Type ordered quantity"); scanf("%f",quantity); for(i=0; i<4; i++) { if (strcmp(mold_inserted,array[i].mold_type)==0) { num_of_boxes=quantity/array[i].box_capacity; printf("%f" "%s",num_of_boxes,array[i].box_type); } else printf("Moldtype inserted does not exist"); } } Επεξ/σία 27 Ιανουαρίου 2018 από Kate30
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα