Τάσος_Δ Δημοσ. 9 Ιουλίου 2010 Δημοσ. 9 Ιουλίου 2010 Στα πλαίσια της βαρεμάρας πριν από τις διακοπές, το πήρα απόφαση επιτέλους να διαγράψω τα ίδια αρχεία που υπάρχουν περισσότερες από μία φορά. Αλλά μιας και γνωρίζω λίγη C είπα να αναθέσω στον υπολογιστή να κάνει τη χαμαλοδουλειά! Έγραψα λοιπόν ένα προγραμματάκι το οποίο συνοπτικά: Δημιουργεί ένα προσωρινό αρχείο κειμένου με τα ονόματα των αρχείων ενός καταλόγου. Αντιγράφει τα ονόματα σε έναν πίνακα συμβολοσειρών. Συγκρίνει το κάθε αρχείο (παίρνοντας τα ονόματα των αρχείων απ´τον προαναφερθέντα πίνακα) με όλα τα υπόλοιπα, ώστε να αποφανθεί αν πρόκειται ή όχι για ίδια αρχεία. (Χειρίζομαι οποιοδήποτε αρχείο σαν ακολουθία χαρακτήρων) Εμφανίζει την επιλογή για τη διαγραφή, ή μη, των όμοιων αρχείων Τώρα κατα την εκτέλεσή του συμβαίνει το εξής περίεργο. Σε κάθε φάκελο, που το έτρεξα δοκιμαστικά, έτρεξε σωστά, βρίσκοντας τα όμοια αρχεία και διαγράφοντάς τα. Εκτός από έναν(!) στον οποίο μου εμφανίζει το μύνημα ότι το τελευταίο αρχείο είναι ίδιο με τον εαυτό του και φυσικά αν επιλέξω διαγραφή διαγράφεται το μοναδικό αρχείο! Παραθέτω και το τμήμα του κώδικα που έχει να κάνει με το πρόβλημα. >for(i=0;i<count;i++) for(j=i+1;j<count;j++){ if((input=fopen(files[i], "r"))==NULL){ printf("Error at file %s\n", files[i]); exit(1); } flag=0; if((input1=fopen(files[j], "r"))==NULL){ printf("Error at file %s\n", files[j]); exit(1); } while((fgets(buf, 100, input))!=NULL && (fgets(buf1, 100, input1))!=NULL){ if(strcmp(buf, buf1)){ flag=1; break; } } if(flag==0){ printf("%d. File %s equals to file %s\n",count1, files[i], files[j]); todelete[count1]=j; count1++; } fclose(input1); fclose(input); } . . . Δώστε μου τα φώτα σας! ΥΓ: Καλώς με βρήκατε :-P
bxenos Δημοσ. 9 Ιουλίου 2010 Δημοσ. 9 Ιουλίου 2010 Δεν είμαι βέβαιος ότι κατάλαβα τη λογική. Έχεις σώσει πολλές φορές το ίδιο αρχείο με διαφορετικό όνομα και θες να σβήσεις τα διπλότυπα; Να συγκρίνεις τα ονόματα μήπως είναι ίδια πριν κάνεις το άνοιγμα (strcmp(onoma,onoma[j]). Ίσως να έχεις κάποια συντόμευση στο πρώτο αρχείο και να σε μπερδεύει.
Τάσος_Δ Δημοσ. 9 Ιουλίου 2010 Μέλος Δημοσ. 9 Ιουλίου 2010 Έχεις σώσει πολλές φορές το ίδιο αρχείο με διαφορετικό όνομα και θες να σβήσεις τα διπλότυπα . Αυτή είναι η λογική, αλλά το υλοποιώ ως εξής: έχοντας αποθηκεύσει όλα τα ονόματα αρχείων σε κάποιον πίνακα, ξεκινάω από το 0ο και με την fopen συσχετίζω το αρχείο με μία μεταβλητή τύπου FILE * στο πρόγραμμά. Στη συνέχεια συσχετίζω με τον ίδιο τρόπο όλα τα επόμενα αρχεία (με τη σειρά που γράφτηκαν στο αρχείο που ανέφερα στην αρχική δημοσίευση) και τα συγκρίνω μεταξύ τους. (ΤΑ ΑΡΧΕΙΑ, ΟΧΙ ΤΑ ΟΝΟΜΑΤΑ!) Πώς; Τα χειρίζομαι σα συμβολοσειρές, πέρνω δηλαδή τα 100 πρώτα στοιχεία του ενός αρχείου, τα συγκρίνω με τα 100 πρώτα του προς σύγκρισην αρχείου (strcmp), στην περίπτωση που είναι ίδια συνεχίζει στα επόμενα 100 κ.ο.κ. Αν είναι έστω και ένα στοιχείο διαφορετικό συνεχίζει με το επόμενο προς σύγκριση αρχείο. Το θέμα είναι ότι ενώ πάντα λειτουργεί σωστά, σε ένα συγκεκριμένο φάκελο (Και εδώ είναι το "κουλό"!) το τελευταίο αρχείο μου το βγάζει ίδιο με τον εαυτό του.
bxenos Δημοσ. 9 Ιουλίου 2010 Δημοσ. 9 Ιουλίου 2010 Το έχω καταλάβει αυτό και σου είπα πριν συγκρίνεις τα αρχεία, να συγκρίνεις τα ονόματα τους πρώτα...αν είναι ίδια, τότε έχεις πρόβλημα. Πόσταρε το περιεχόμενο του καταλόγου.
Τάσος_Δ Δημοσ. 9 Ιουλίου 2010 Μέλος Δημοσ. 9 Ιουλίου 2010 Χμμμ, μήπως δε χρησιμοποιείτε ελληνικούς χαρακτήρες στο μήνυμα σας ; Υπενθυμίζουμε ότι απαγορεύεται η χρήση greeklish πώς το προσπερνάω; Είναι περίεργο το να συγκρίνει ένα αρχείο με τον εαυτό του, το ένα ξεκινάει από i και το άλλο από i+1.
Aesmade Δημοσ. 11 Ιουλίου 2010 Δημοσ. 11 Ιουλίου 2010 Ανοίγεις τα αρχεία σε mode "r", αν είναι λοιπόν αρχεία binary μπορεί να μην διαβαστούν σωστά. Άνοιξέ τα σε mode "rb". Επίσης, χρησιμοποίησε fread αντί για fgets και memcmp αντί για strcmp. Δεν μου έρχεται άλλος λόγος που μπορεί να ευθύνεται για την εμπλοκή.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.