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

Ένα περίεργο πρόβλημα! (C)


Τάσος_Δ

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

Δημοσ.

Στα πλαίσια της βαρεμάρας πριν από τις διακοπές, το πήρα απόφαση επιτέλους να διαγράψω τα ίδια αρχεία που υπάρχουν περισσότερες από μία φορά. Αλλά μιας και γνωρίζω λίγη 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

Δημοσ.

Δεν είμαι βέβαιος ότι κατάλαβα τη λογική.

Έχεις σώσει πολλές φορές το ίδιο αρχείο με διαφορετικό όνομα και θες να σβήσεις τα διπλότυπα;

 

Να συγκρίνεις τα ονόματα μήπως είναι ίδια πριν κάνεις το άνοιγμα (strcmp(onoma,onoma[j]).

Ίσως να έχεις κάποια συντόμευση στο πρώτο αρχείο και να σε μπερδεύει.

Δημοσ.

Έχεις σώσει πολλές φορές το ίδιο αρχείο με διαφορετικό όνομα και θες να σβήσεις τα διπλότυπα

.

 

Αυτή είναι η λογική, αλλά το υλοποιώ ως εξής:

 

έχοντας αποθηκεύσει όλα τα ονόματα αρχείων σε κάποιον πίνακα, ξεκινάω από το 0ο και με την fopen συσχετίζω το αρχείο με μία μεταβλητή τύπου FILE * στο πρόγραμμά. Στη συνέχεια συσχετίζω με τον ίδιο τρόπο όλα τα επόμενα αρχεία (με τη σειρά που γράφτηκαν στο αρχείο που ανέφερα στην αρχική δημοσίευση) και τα συγκρίνω μεταξύ τους. (ΤΑ ΑΡΧΕΙΑ, ΟΧΙ ΤΑ ΟΝΟΜΑΤΑ!) Πώς; Τα χειρίζομαι σα συμβολοσειρές, πέρνω δηλαδή τα 100 πρώτα στοιχεία του ενός αρχείου, τα συγκρίνω με τα 100 πρώτα του προς σύγκρισην αρχείου (strcmp), στην περίπτωση που είναι ίδια συνεχίζει στα επόμενα 100 κ.ο.κ. Αν είναι έστω και ένα στοιχείο διαφορετικό συνεχίζει με το επόμενο προς σύγκριση αρχείο.

 

Το θέμα είναι ότι ενώ πάντα λειτουργεί σωστά, σε ένα συγκεκριμένο φάκελο (Και εδώ είναι το "κουλό"!) το τελευταίο αρχείο μου το βγάζει ίδιο με τον εαυτό του.

Δημοσ.

Το έχω καταλάβει αυτό και σου είπα πριν συγκρίνεις τα αρχεία, να συγκρίνεις τα ονόματα τους πρώτα...αν είναι ίδια, τότε έχεις πρόβλημα.

 

Πόσταρε το περιεχόμενο του καταλόγου.

Δημοσ.
Χμμμ, μήπως δε χρησιμοποιείτε ελληνικούς χαρακτήρες στο μήνυμα σας ; Υπενθυμίζουμε ότι απαγορεύεται η χρήση greeklish

πώς το προσπερνάω;

 

Είναι περίεργο το να συγκρίνει ένα αρχείο με τον εαυτό του, το ένα ξεκινάει από i και το άλλο από i+1.

Δημοσ.

Ανοίγεις τα αρχεία σε mode "r", αν είναι λοιπόν αρχεία binary μπορεί να μην διαβαστούν σωστά. Άνοιξέ τα σε mode "rb". Επίσης, χρησιμοποίησε fread αντί για fgets και memcmp αντί για strcmp. Δεν μου έρχεται άλλος λόγος που μπορεί να ευθύνεται για την εμπλοκή.

Αρχειοθετημένο

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

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