gitz Δημοσ. 1 Σεπτεμβρίου 2009 Δημοσ. 1 Σεπτεμβρίου 2009 γεια σας, μήπως ξέρετε εάν υπάρχει εντολή που να μπορώ να διαγράψω ένα στοιχείο κάποιου πίνακα??? έχω έναν πίνακα char name[100][20] και θέλω να διαγράφει κάποιο στοιχείο απο τη μέση του πίνακα αλλά η θέση αυτή να μη μένει κενή αλλά να συμπληρώνεται απο τα υπόλοιπα στοιχεία...
kagelos Δημοσ. 1 Σεπτεμβρίου 2009 Δημοσ. 1 Σεπτεμβρίου 2009 Δεν γίνεται να διαγραφεί κάποιο στοιχείο ενός πίνακα. Θα πρέπει να χρησιμοποιήσεις/φτιάξεις κάποια δομή δεδομένων π.χ. λίστα.
gitz Δημοσ. 1 Σεπτεμβρίου 2009 Μέλος Δημοσ. 1 Σεπτεμβρίου 2009 μπορώ μήπως να διαγράψω τα περιεχόμενα ενός αρχείου? Θα μπορούσα να περνούσα ενα ένα τους χαρακτηρες και να τους κανω space αλλά το θέλο κενό...
kagelos Δημοσ. 1 Σεπτεμβρίου 2009 Δημοσ. 1 Σεπτεμβρίου 2009 Έστω ότι έχεις ένα αρχείο με τα παρακάτω περιεχόμενα : 0123456789 και θες να σβήσεις το string "456" ώστε να μείνει το 0123789 μέσα στο αρχείο. Ο μόνος τρόπος είναι να γράψεις το αρχείο από την αρχή. Σε ένα αρχείο μπορείς μόνο να κάνεις append και replace. Δεν γίνεται να προσθέσεις κάτι στην αρχή ή στη μέση. Αυτό γίνεται μόνο ξαναγράφοντας το αρχείο από την αρχή. Οι εφαρμογές που χρησιμοποιούν πολύ μεγάλα αρχεία (π.χ. βάσεις δεδομένων) συνήθως προσθέτουν στο τέλος του αρχείου τμήματα και έχουν δείκτες πιο πριν ώστε να ξέρουν ότι κάτι που βρίσκεται στη μέση του αρχείου συνεχίζετε και πιο κάτω. Για αυτό χρειάζονται και defragment που και που ώστε να ξαναγραφτούν τα δεδομένα με την σειρά (για να μην αργεί η ανάκτηση). Π.χ. αν έχουμε ένα αρχείο με τα βιογραφικά ανθρώπων και είναι κάπως έτσι (οι στήλες χωρίζονται με -): 1-Τάκης-3ο Δημοτικό Κάτω Παναγιάς,666ο Γυμνάσιο Σαρδαναπαλίων-0000 2-Μήτσος-Αγράμματος,Μαθήματα μαραγκού στον Κώστα απέναντι-0000 3-Γιώργος-Μπλα μπλα-0000 Το 0000 μας χρειάζεται ώστε αν θέλουμε να προσθέσουμε δεδομένα σε μια εγγραφή, να σημειώσουμε σε ποια γραμμή του αρχείου συνεχίζετε πλέον η εγγραφή. Π.χ. έστω ότι θέλουμε να προσθέσουμε στην πρώτη εγγραφή δεδομένα στο βιογραφικό το αρχείο θα γινόταν (κάπως) έτσι : 1-Τάκης-3ο Δημοτικό Κάτω Παναγιάς,666ο Γυμνάσιο Σαρδαναπαλίων-0004 2-Μήτσος-Αγράμματος,Μαθήματα μαραγκού στον Κώστα απέναντι-0000 3-Γιώργος-Μπλα μπλα-0000 4--10ο Λύκειο Μπαγκλαντές-0000 <- και άλλος pointer αν θελήσουμε να συνεχίσουμε ακόμα πιο κάτω την εγγραφή. Βέβαια οι pointers στην πράξη δεν δείχνουν σε κάποια γραμμή στο αρχείο αλλά σε κάποιο offset σε bytes (δηλ. σε πόσα bytes από την αρχή του αρχείου συνεχίζετε η εγγραφή). Επιπλέον συνήθως οι βάσεις δεδομένων, για τα αρχεία δεδομένων, δεν χρησιμοποιούν την παραπάνω τακτική. Απλά δεσμεύουν εκ των προτέρων χώρο για κάθε στήλη. Αυτή η μέθοδος χρησιμοποιείται συνήθως για τα αρχεία με index - και όπως κρίνει ο καθένας στην εφαρμογή του.
Directx Δημοσ. 1 Σεπτεμβρίου 2009 Δημοσ. 1 Σεπτεμβρίου 2009 γεια σας, μήπως ξέρετε εάν υπάρχει εντολή που να μπορώ να διαγράψω ένα στοιχείο κάποιου πίνακα??? έχω έναν πίνακα char name[100][20] και θέλω να διαγράφει κάποιο στοιχείο απο τη μέση του πίνακα αλλά η θέση αυτή να μη μένει κενή αλλά να συμπληρώνεται απο τα υπόλοιπα στοιχεία... Μπορείς να χρησιμοποιήσεις την memmove η οποία επιτρέπει την ελεύθερη μετακίνηση των memory blocks μεταξύ source και destination pointers, ώστε να επικαλύψεις την θέση του πίνακα που επιθυμείς με τα υπόλοιπα διαθέσιμα στοιχεία: > /*-memmove overwrite directx-------------------------------------------------*/ #include <stdio.h> #include <string.h> #ifdef __BORLANDC__ /* C++ Builder compiler specific */ #pragma hdrstop #endif /*---------------------------------------------------------------------------*/ #define _MAXITEM 10 #ifdef __BORLANDC__ #pragma argsused #endif int main() { char Array[_MAXITEM][20]; int nCount; /* Generate 10 items */ for(nCount = 0; nCount < _MAXITEM; nCount++) { sprintf(Array[nCount], "Element number %d", nCount); printf("[%.2d] \"%s\"\n", nCount, Array[nCount]); } /* Remove 5th element from the Array by moving the next array items (6+) on it ... */ memmove(&Array[5], &Array[6], sizeof(Array) - sizeof(Array[0]) * 6); /* Clear last array item (since array items moved upwards by one) */ strcpy(Array[_MAXITEM - 1], ""); printf("...\n"); /* Print again */ for(nCount = 0; nCount < _MAXITEM; nCount++) printf("[%.2d] \"%s\"\n", nCount, Array[nCount]); /* End of program */ getchar(); return 0; } /*---------------------------------------------------------------------------*/ Έξοδος (διαγραφή Array item #5): > [00] "Element number 0" [01] "Element number 1" [02] "Element number 2" [03] "Element number 3" [04] "Element number 4" [05] "Element number 5" [06] "Element number 6" [07] "Element number 7" [08] "Element number 8" [09] "Element number 9" ... [00] "Element number 0" [01] "Element number 1" [02] "Element number 2" [03] "Element number 3" [04] "Element number 4" [05] "Element number 6" [06] "Element number 7" [07] "Element number 8" [08] "Element number 9" [09] "" Υ.Γ. Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder 2009 και μπορεί να περιέχει bugs ή άλλες αβλεψίες. Καλή συνέχεια.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.