Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C

Δημοσίευσηαπό c7p » 31 Μάιος 2012, 02:23

Έχω ένα δυαδικό αρχείο και κάνω καταγραφές σε αυτό (η κάθε καταγραφή έχει 2 "πεδία" 8 byte η κάθε μια), η κάθε καταγραφή πιάνει 16 byte. Έστω ότι έχω n, καταγραφές και θέλω να αντικαταστήσω την m καταγραφή (m<n) από την τελευταία, και μετά να διαγράψω ότι υπάρχει στη θέση τις παλιάς καταγραφής (τα τελευταία 16 bytes του αρχείου δηλαδή). Από όσο έχω δει δεν υπάρχει εντολή "διαγραφής" μέρους του αρχείου.

Ένας τρόπος είναι να δημιουργήσω ένα προσωρινό αρχείο και να κάνω αυτό που θέλω, αλλά αυτός ο τρόπος θέλει γράψιμο. Αν δεν κάνω λάθος αυτό κάνει και το ΛΣ όταν πειράζουμε γενικά αρχεία κειμένου (κρατάει ένα κρυφό προσωρινό αρχείο)

Τώρα είναι η ερώτηση, πολύ απλά θα μπορούσε να γίνει αν θα μπορούσα να να κάνω αντιγραφή της τελευταία καταγραφή στην θέση της m -εύκολο και δυνατό-, και μετά να έκανα κάπως να πείραζα την SEEK_END ώστε να δείχνει 16 byte πιο κάτω (???), πράγμα που θα ήταν αρκετά ωραίο αν γινόταν αλλά δεν ξέρω αν είναι δυνατό.

Λύση: http://linux.about.com/library/cmd/blcm ... uncate.htm
Άβαταρ μέλους
c7p
powerTUX
powerTUX
 
Δημοσιεύσεις: 1849
Εγγραφή: 30 Μάιος 2009, 16:09
Τοποθεσία: Κατερίνη
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό simosx » 31 Μάιος 2012, 02:45

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

Αν τα δεδομένα είναι λίγα, μπορείς να τα διαβάσεις όλα στη μνήμη και να γράφεις πάντα ένα νέο αρχείο.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 02 Ιουν 2012, 12:48

c7p έγραψε:Έχω ένα δυαδικό αρχείο και κάνω καταγραφές σε αυτό (η κάθε καταγραφή έχει 2 "πεδία" 8 byte η κάθε μια), η κάθε καταγραφή πιάνει 16 byte. Έστω ότι έχω n, καταγραφές και θέλω να αντικαταστήσω την m καταγραφή (m<n) από την τελευταία, και μετά να διαγράψω ότι υπάρχει στη θέση τις παλιάς καταγραφής (τα τελευταία 16 bytes του αρχείου δηλαδή). Από όσο έχω δει δεν υπάρχει εντολή "διαγραφής" μέρους του αρχείου.

Ένας τρόπος είναι να δημιουργήσω ένα προσωρινό αρχείο και να κάνω αυτό που θέλω, αλλά αυτός ο τρόπος θέλει γράψιμο. Αν δεν κάνω λάθος αυτό κάνει και το ΛΣ όταν πειράζουμε γενικά αρχεία κειμένου (κρατάει ένα κρυφό προσωρινό αρχείο)

Τώρα είναι η ερώτηση, πολύ απλά θα μπορούσε να γίνει αν θα μπορούσα να να κάνω αντιγραφή της τελευταία καταγραφή στην θέση της m -εύκολο και δυνατό-, και μετά να έκανα κάπως να πείραζα την SEEK_END ώστε να δείχνει 16 byte πιο κάτω (???), πράγμα που θα ήταν αρκετά ωραίο αν γινόταν αλλά δεν ξέρω αν είναι δυνατό.

Δοκίμασες να κάνεις απευθείας update το αρχείο σου χρησιμοποιώντας τις fseek() και fwrite() ;

Εφόσον το αρχείο σου αποτελείται αυστηρά από συνεχόμενα τμήματα των 16 bytes η παραπάνω διαδικασία λογικά θα σου λειτουργήσει. Προφανώς θα πρέπει να υπολογίσεις το offset που θα περάσεις στην fseek(). Αν το αρχείο σου είναι πολύ μεγάλο, δοκίμασε με την lseek()
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό g1wrg0s » 02 Ιουν 2012, 13:15

ετσι απλα δεν θα προσθεσει στοιχεια στο αρχειο; Θα κανει αντικατασταση ;
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πρώτα βήματα
2 Ubuntu 12.10 quantal 3.10.20-031020-generic 32bit (el_GR.UTF-8, Unity ubuntu), Windows 8
3 Intel Core i5-3230M CPU @ 2.60GHz ‖ RAM 7923 MiB ‖ Acer VA50_HC_CR - Acer Aspire V3-571G
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915} ⋮ nVidia Device [10de:0fe1] {}
5 eth0: Broadcom NetLink BCM57785 Gigabit Ethernet PCIe [14e4:16b5] (rev 10) ⋮ wlan0: Atheros Inc. AR9462 Wireless Network Adapter [168c:0034] (rev 01)
g1wrg0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 196
Εγγραφή: 26 Μάιος 2012, 10:29
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 02 Ιουν 2012, 13:22

g1wrg0s έγραψε:ετσι απλα δεν θα προσθεσει στοιχεια στο αρχειο; Θα κανει αντικατασταση ;

Με την fseek() θα στείλει τον file-descriptor στο επιθυμητό σημείο του αρχείου, μέσω του ορίσματος offset (εννοείται πως το αρχείο πρέπει να το ανοίξει ως read/write).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό g1wrg0s » 02 Ιουν 2012, 13:34

θα παει εκει που θελει.
η ερωτηση μου ειναι μετα απο αυτο. Απλα θα προσθεσει νεα στοιχεια (χωρις αντικατασταση) ή θα αντικαταστησει τ ηδη υπαρχοντα 2 Byte ;
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πρώτα βήματα
2 Ubuntu 12.10 quantal 3.10.20-031020-generic 32bit (el_GR.UTF-8, Unity ubuntu), Windows 8
3 Intel Core i5-3230M CPU @ 2.60GHz ‖ RAM 7923 MiB ‖ Acer VA50_HC_CR - Acer Aspire V3-571G
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915} ⋮ nVidia Device [10de:0fe1] {}
5 eth0: Broadcom NetLink BCM57785 Gigabit Ethernet PCIe [14e4:16b5] (rev 10) ⋮ wlan0: Atheros Inc. AR9462 Wireless Network Adapter [168c:0034] (rev 01)
g1wrg0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 196
Εγγραφή: 26 Μάιος 2012, 10:29
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 02 Ιουν 2012, 13:41

Δεν είμαι 100% σίγουρος, νομίζω όμως πως κάνοντας fwrite(2 bytes) απλά θα αντικατασταθούν τα τρέχοντα 2 bytes του αρχείου. Νομίζω δηλαδή πως τα υπόλοιπα δεν θα γίνουν truncated.

ΥΓ. Αν το δοκιμάσει κάποιος ας μας ενημερώσει για το αποτέλεσμα (ενδεχομένως να το δοκιμάσω κι εγώ, αλλά αργότερα).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό stamatiou » 02 Ιουν 2012, 13:57

Αυτά τα λέει στο βιβλίο που έχουμε πει;
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 02 Ιουν 2012, 14:01

stamatiou έγραψε:Αυτά τα λέει στο βιβλίο που έχουμε πει;

Δεν θυμάμαι καθόλου Γιώργο. Αν τα λέει λογικά θα τα λέει στο κεφάλαιο που μιλάει για αρχεία.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό g1wrg0s » 02 Ιουν 2012, 14:16

Εχεις δικιο φιλε. Αν αυτο ζητα το παιδι που εγραψε την αρχικη απορια τοτε μια λυση ειναι αυτη. Δηλαδη να χρησιμοποιησει αυτες τις δυο συναρτησεις.

Κώδικας: Επιλογή όλων
#include "stdio.h"
#include "stdlib.h"
main()
{
int i=0;
FILE *o_f;
o_f=fopen("text","wb");
char s[]="Gia na doume ti kanei h frite()";
fwrite(s,1,sizeof(s),o_f);
fseek(o_f,7,SEEK_SET);
fwrite("DOUME",1,sizeof("DOUME")-1,o_f);
fclose(o_f);

FILE *i_f;
i_f=fopen("text","rb");
char s2[40];

fread(s2,1,40*sizeof(char),i_f);
for(i=0;i<40;i++) printf("%c",s2[i]);
fprintf("\n");
fclose(i_f);
}


Ειναι αρκετα ακαταστατος ο κωδικας και γι αυτο οποιος δεν τον καταλαβαινει ας ρωτησει. Νομιζω πως το νοημα το πιανεις .
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πρώτα βήματα
2 Ubuntu 12.10 quantal 3.10.20-031020-generic 32bit (el_GR.UTF-8, Unity ubuntu), Windows 8
3 Intel Core i5-3230M CPU @ 2.60GHz ‖ RAM 7923 MiB ‖ Acer VA50_HC_CR - Acer Aspire V3-571G
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915} ⋮ nVidia Device [10de:0fe1] {}
5 eth0: Broadcom NetLink BCM57785 Gigabit Ethernet PCIe [14e4:16b5] (rev 10) ⋮ wlan0: Atheros Inc. AR9462 Wireless Network Adapter [168c:0034] (rev 01)
g1wrg0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 196
Εγγραφή: 26 Μάιος 2012, 10:29
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι

cron