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

C προγραμματισμό


gitz

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

Δημοσ.

γεια σας, μήπως ξέρετε εάν υπάρχει εντολή που να μπορώ να διαγράψω ένα στοιχείο κάποιου πίνακα??? έχω έναν πίνακα char name[100][20] και θέλω να διαγράφει κάποιο στοιχείο απο τη μέση του πίνακα αλλά η θέση αυτή να μη μένει κενή αλλά να συμπληρώνεται απο τα υπόλοιπα στοιχεία...

Δημοσ.

Δεν γίνεται να διαγραφεί κάποιο στοιχείο ενός πίνακα. Θα πρέπει να χρησιμοποιήσεις/φτιάξεις κάποια δομή δεδομένων π.χ. λίστα.

Δημοσ.

μπορώ μήπως να διαγράψω τα περιεχόμενα ενός αρχείου? Θα μπορούσα να περνούσα ενα ένα τους χαρακτηρες και να τους κανω space αλλά το θέλο κενό...

Δημοσ.

Έστω ότι έχεις ένα αρχείο με τα παρακάτω περιεχόμενα :

 

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 - και όπως κρίνει ο καθένας στην εφαρμογή του.

Δημοσ.
γεια σας, μήπως ξέρετε εάν υπάρχει εντολή που να μπορώ να διαγράψω ένα στοιχείο κάποιου πίνακα??? έχω έναν πίνακα 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 ή άλλες αβλεψίες.

 

Καλή συνέχεια.

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

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

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