Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πρόβλημα σε βρόχο while..

Îåêßíçóå áðü ôï ìÝëïò kallileo. Τελευταία δημοσίευση από το μέλος Markos στις 16-06-2009, 17:53. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  16-06-2009, 12:43 51723

    Πρόβλημα σε βρόχο while..

    Εχω δυο αρχεία text με την παρακάτω διάταξη:

    input1.txt

    560-005;CORFU_1A;560-005-010
    560-005;CORFU_1B;560-005-011
    560-005;CORFU_1E;560-005-012

    input2.txt

    562-Z21;METAL-ANTHRACITE;562-121-000
    562-Z21;METAL-9007;562-221-000
    562-Z22;METAL-ANTHRACITE;562-122-000

     

    Επίσης έχω και την παρακάτω συνάρτηση:

    public void Conversion()
            {
                try
                {
                    using (sr1 = new StreamReader("c:\\input1.txt"))
                    {
                        using (sr2 = new StreamReader("c:\\input2.txt"))
                        {
                            file = new FileStream("c:\\output.txt", FileMode.Create, FileAccess.Write);
                            sw = new StreamWriter(file);
                            string line1;
                            string line2;

                            while ((line1 = sr1.ReadLine()) != null)
                            {
                                string[] temp1 = line1.Split(new char[] { ';' });

                                while ((line2 = sr2.ReadLine()) != null)
                                {
                                    string[] temp2 = line2.Split(new char[] { ';' });

                                    string final = temp1[0] + ";" + temp1[1] + ";" + temp1[2] + ";" + temp2[2] + ";" + temp1[2] + "-" + temp2[2];
                                    sw.WriteLine(final);
                                }
                            }
                        }
                    }
                }
                finally
                {
                    sr1.Close();
                    sr2.Close();
                    sw.Close();
                    file.Close();
                }
            }

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

     Ευχαριστώ

  •  16-06-2009, 14:53 51727 σε απάντηση της 51723

    Απ: Πρόβλημα σε βρόχο while..

    Ο τρόπος με τον οποίο ελέγχεις για EndOfStream είναι τουλάχιστον περίεργος - και δεν δουλεύει. Αν υπάρχει οποιοδήποτε πρόβλημα με το αρχείο η ReadLine θα ρίξει exception. Αντί γι αυτό δοκίμαστε να ελέγξεις το sr1.EndOfStream. Επίσης, τα Close() στο τέλος είναι περιττά εφόσον χρησιμοποιείς using. Μπορείς νά γράψεις τον κώδικα σου πολύ πιο απλά:

    using (var sr1 = new StreamReader("c:\\input1.txt"))
    using (var sr2 = new StreamReader("c:\\input2.txt"))
    using (var file = new FileStream("c:\\output.txt", FileMode.Create, FileAccess.Write))
    using (var sw = new StreamWriter(file))
    {
        ...
    }

    Έχω μία απορία πάντως. Όπως έχεις δώσει τον κώδικα δεν μπορεί να γίνει compile γιατί δεν ορίζεις πουθενά τον τύπο των sr1, sr2, file, sw. Μήπως ορίζεις κάπου παραπάνω αυτές τις μεταβλητές? Κάτι τέτοιο δεν είναι καθόλου σωστή τακτική. Μία μεταβλητή πρέπει να ορίζεται όσο το δυνατόν πιο κοντά στο σημείο όπου χρησιμοποιείται. Διαφορετικά θα πρέπει να αντιμετωπίσεις διάφορα προβλήματα π.χ. τί γίνεται αν κάποιος πάει να πειράξει τη μεταβλητή μετά το Close() ή το using {} ? Πόσο θα διατηρηθεί στη μνήμη αυτό το κλεισμένο stream? Τί θα γίνει αν ξεχαστείς και χρησιμοποιήσεις την ίδια μεταβλητή και για άλλο σκοπό?

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  16-06-2009, 14:55 51728 σε απάντηση της 51723

    Απ: Πρόβλημα σε βρόχο while..

    Ο βρόχος συνεχίζει κανονικά και σου δίνει αυτό που θέλεις, αλλά όμως εσύ γράφεις
    μόνο μέσα στην 2η while "sw.WrtiLine(final)". Πρέπει να αλλάξεις λίγο τον κώδικά σου.

    Βάλε και καμμιά catch, και επίσης αν έβαζες ένα breakpoint στην πρώτη while, θα έβλεπες τι κάνει.
    Check it out...debugging rules στο Visual Studio.

    ;)

    [EDITED] Και όλα τα παραπάνω που λέει ο Παναγιώτης επίσης είναι rules.

  •  16-06-2009, 15:02 51729 σε απάντηση της 51723

    Απ: Πρόβλημα σε βρόχο while..

    Δεν καταλαβαίνω τι προσπαθείς να κάνεις σε αυτό το τμήμα κώδικα (ανασυνδυασμός τιμών ίσως;) αλλά είναι φανερό γιατί ο εξωτερικός βρόχος τρέχει μόνο μια φορά:την πρώτη φορά που τρέχει ο εξωτερικός βρόχος ο εσωτερικός βρόχος τρέχει μέχρι ο δείκτης να φτάσει στο τέλος του αρχείου input2.txt.Την δεύτερη φορά που θα τρέξει ο εξωτερικός βρόχος ο δείκτης παραμένει στο τέλος του αρχείου, η συνθήκη στον εσωτερικό βρόχο θα επιστρέψει false εξαρχής και άρα δεν θα εκτελεστεί καθόλου.Πρέπει λοιπόν πριν την αρχή του εσωτερικου βρόχου να βάλεις τον δείκτη πάλι στην αρχή:

      while ((line1 = sr1.ReadLine()) != null)
                            {
                                string[] temp1 = line1.Split(new char[] { ';' });
    
    
                               sr2.BaseStream.Seek(0,SeekOrigin.Begin);
    
                                while ((line2 = sr2.ReadLine()) != null)
                                {
    .........








  •  16-06-2009, 15:11 51731 σε απάντηση της 51729

    Απ: Πρόβλημα σε βρόχο while..

    darklynx αυτό που λες είναι ότι δεν τρέχει δεύτερη φορά το εσωτερικό while. Κανονικά το εξωτερικό while θα έπρεπε να τρέξει χωρίς πρόβλημα - εκτός και αν ο kallileo έκανε λάθος και θεωρεί ότι δεν τρέχει ο εξωτερικός βρόχος επειδή δεν βλέπει αποτελέσματα στο output.txt . Όπως και να έχει, και η ερωτηση χρειάζεται επεξήγηση και ο κώδικας καθάρισμα για να βγει άκρη.

    Και σίγουρα μία εξήγηση τί προσπαθεί να κάνει ο κώδικας? Γιατί έτσι όπως είναι μοιάζει να προσπαθεί να γράψει το συνδυασμό όλων των γραμμών του input1 με τις γραμμές του input2.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  16-06-2009, 15:18 51732 σε απάντηση της 51731

    Απ: Πρόβλημα σε βρόχο while..

    Ο εξωτερικός βρόχος τρέχει πράγματι χωρίς πρόβλημα.Όμως όλη η δουλειά εκτελείται στον εσωτερικό βρόχο και για το λόγο αυτό δεν θα απορούσα αν δόθηκε η εντύπωση στον kallileo ότι ο εξωτερικός βρόχος είναι αυτός που δεν τρέχει.
    Όσο για το τι κάνει ο κώδικας προτιμώ να αφήσω τη φαντασία μου να δουλέψει(γενετικοί αλγόριθμοι ίσως; Stick out tongue)
  •  16-06-2009, 15:23 51733 σε απάντηση της 51732

    Απ: Πρόβλημα σε βρόχο while..

    Το ποιο πιθανό σενάριο που μου ήρθε στο μυαλό για το τι μπορεί να προσπαθεί ήταν ότι απλά, έπαιζε.

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

  •  16-06-2009, 16:09 51734 σε απάντηση της 51733

    Απ: Πρόβλημα σε βρόχο while..

    Ο κώδικας αυτός χρειάζεται για δημιουργία ενός αρχείου κειμένου που θα ειναι συνδυασμός του input1(350 γραμμές) και input2(32 γραμμές) και με τα δεδομένα που έχουν βγαίνει περιπου 11200 γραμμές οπότε δεν θα μπορούσε να γραφτεί με το χέρι. Μία βάση δεδομένων για ένα CAD πρόγραμμα είναι που βγάζει μία λίστα προιόντων σύμφωνα με το αρχείο. Για μια φορά ειναι...

    Βασικά είναι αυτό που λέει ο DarkLynx....To θέμα είναι ότι στο εσωτερικό βρόχο όταν φτάνει στο EOF σταματάει να εκτελείται και ο εξωτερικός και πρέπει είτε να ανοίγω το δεύτερο αρχείο στο πρώτο βρόχο είτε να επανατοποθετώ τον κέρσορα στην αρχή του αρχείου. Έκανα κάποιες μικροαλλαγές... Πως μπορώ να κλείσω το sr2 μέσα στο finaly(αν είχα) εφόσον είναι out of scope. Τι άλλο μπορώ να κάνω για να τον βελτιώσω(για εκπαιδευτικό σκοπό);

    class Program
        {
            static void Main(string[] args)
            {
                Program pr = new Program();
                pr.Conversion();
            }

            public void Conversion()
            {
                try
                {
                    using (StreamReader sr1 = new StreamReader("c:\\input1.txt"))
                    using (FileStream file = new FileStream("c:\\output.txt", FileMode.Create, FileAccess.Write))
                    using (StreamWriter sw = new StreamWriter(file))
                    {
                        string line1;
                        string line2;

                        while ((line1 = sr1.ReadLine()) != null)
                        {
                            string[] temp1 = line1.Split(new char[] { ';' });
                            StreamReader sr2 = new StreamReader("c:\\input2.txt");
                            while ((line2 = sr2.ReadLine()) != null)
                            {
                                string[] temp2 = line2.Split(new char[] { ';' });

                                string final = temp1[0] + ";" + temp1[1] + ";" + temp2[0] + ";" + temp1[2] + "-" + temp2[2];
                                sw.WriteLine(final);
                            }
                        }
                     }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }


             }
        }

  •  16-06-2009, 17:53 51737 σε απάντηση της 51734

    Απ: Πρόβλημα σε βρόχο while..

    Γιατί δε διαβάζεις τα δύο αρχεία μια φορά, να παράγεις το συνδυασμό των δεδομένων στη μνήμη και στη συνέχεια ν' αποθηκεύσεις το αποτέλεσμα; Ακόμα, θα μπορούσες να κάνεις import τα δεδομένα σε δύο πίνακες και να πάρεις το Cross Join.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems