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

Διάβασμα πολυδιάστατου πίνακα από αρχείο txt σε γλώσσα c


Kate30

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

Καλησπέρα!

Ασχολούμαι εδώ και λίγο καιρό με γλώσσα C και θα ήθελα να μάθω πως μπορώ να διαβάσω έναν πίνακα ο οποίος βρίσκεται σε αρχείο .txt

Έχω ψάξει σε tutorials και γενικότερα στο internet και δεν έχω βρει κάτι σχετικό...

Χρειάζομαι σε πρώτη φάση έναν εύκολο/απλό τρόπο αν γίνεται (χωρίς δείκτες , δυναμική δέσμευση και πιο πολύπλοκα πραγματάκια) για να

το καταλάβω (λόγω της μικρής μου εμπειρίας) :D

***Θα με βοηθούσε πολύ ένα απλό παραδειγματάκι με πίνακα integer 3*3

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

  • Moderators

Λοιπόν, αυτή τη στιγμή έχω 4 στα 9 bingo, αλλά πιστεύω μπορούμε και καλύτερα. Δείξε μας τι έχεις κάνει μέχρι τώρα και πού κολλάς ακριβώς.

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

Δοκίμασε να το σπάσεις σε επιμέρους μικρά βήματα και κάντο σιγά σιγά.
Π.χ. αρχικά, δοκίμασε να ανοίξεις ένα οποιοδήποτε text αρχείο, να το διαβάζεις γραμμή, γραμμή και να το εκτυπώνεις.
Μετά πρέπει να ξέρεις πως ακριβώς θα είναι αποθηκευμένος ο "πίνακας" στο αρχείο. Θα είναι πχ. κάθε γραμμή του αρχείου και γραμμή του πίνακα με τα στοιχεία χωρισμένα με κενό (ή κόμμα ή τι);
Αν ναι, ξέχνα τότε για λίγο το αρχείο, φτιάξε με το χέρι ένα string που να αναπαριστά μια γραμμή του αρχείου (πχ. char *line = "32 46 32";) και γράψε μια συνάρτηση που να παρσάρει το string και να αποθηκεύει τα στοιχεία κάπου. Επίσης ένα ακόμα ξεχωριστό μικρό πρόβλημα είναι πως θα μετατρέψεις ένα string που αναπαριστά έναν ακέραιο σε int. Όλα αυτά θα τα βρεις εύκολα με λίγο googling, το μόνο που χρειάζεται να σκεφτείς για να γράψεις είναι την συνάρτηση που θα παρσάρει κάθε γραμμή του αρχείου.

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

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

Καταρχήν , ευχαριστώ για την απάντηση!

Ξεκίνησα να γράφω κώδικα για την εφαρμογή που θέλω να φτιάξω και νομίζω ότι στην περίπτωση μου  ισχύει "Νοw I have more than two problems :D:D!"

Έχω κολλήσει σε δύο σημεία...(χωρίς ακόμα να έχω προσπαθήσει το διάβασμα από αρχείο 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

Γενικά θέλω να προσθέσω πολλά πράγματα ακόμη αλλά προς το παρόν προσπαθώ να το κρατήσω απλό και να το χτίζω βήμα-βήμα.

Συγνώμη για τα μαργαριτάρια που θα δείτε αλλά είναι ο πρώτος μου κώδικας !!

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

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

@Kate30 Δεν διάβασα τον κωδικα σου, αλλα με μια πολυ γρηγορη ματια φαινεται οτι χρησιμοποιείς τον τελεστη εκχωρησης (=) αντι για τον τελεστη συγκρισης (==) σε ολα τα if σου.

Ειναι valid C++ (το τι ακριβως κανει δε σε ενδιαφερει σε αυτη την φαση), αλλα ειμαι 100% σιγουρος οτι δεν θες να κανει αυτο που κανει τωρα ο κωδικας.

TL;DR: Αλλαξε τα = σε == οπου εχεις if.

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

[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 αντί να τα γράφεις έτσι.
   

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

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

Μια ιδέα από 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

και το παράθυρο:

 

 

Untitled.jpg

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

  • 2 εβδομάδες αργότερα...
Δημοσ. (επεξεργασμένο)

Ευχαριστώ για τις απαντήσεις σας! Μετά από αρκετές αλλαγές που έκανα φαίνεται ότι 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");
	  
		 }

}

 

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

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...