JdCZT Δημοσιεύτηκε Απρίλιος 16, 2010 #1 Δημοσιεύτηκε Απρίλιος 16, 2010 Παιδες πριν ξεκινησω ΔΕ θελω να μου λυσετε την ασκηση....απλα δεν ξερω απο που να ξεκινησω....Η ολη ασκηση πρεπει να τρεξει σε Solaris.Ο καθηγητης μας ειπε να τη γραψουμε σε C αλλα απο επιπεδο ακησεων-μαθηματων στο προηγουμενο (αλυσιδα) ουτε ξυστα δεν περασαμε...Για αρχη εχω γραψει... #include<unistd.h>#include<sys/wait.h>#include<stdio.h>void main(int argc, char *argv[])int ret; ret=fork(); if(ret>0){ //pateras wait(); . . . } else if(ret==0){ //paidi mkdir /Documents/Ergasies; ps -A > /Documents/Ergasies/processes.txt; . . . } else{ printf("den dimiourgithike diergasia\n"); exit(1); } Οι εντολες στο "παιδι" στεκουν συντακτικα....μας εχει δωσει αυτες τις εντολες αλλα ειναι απο Solaris...Δουλευουν σε προγραμματισμο C;;; Aπο εντολες τι θα χρειαστω ;;; Οτι μπορεσετε και οποιος μπορεσει ας απαντησει παιδια γιατι εχω χασει και τα αυγα και τα πασχαλια Ευχαριστω προκαταβολικα...
backgman Απρίλιος 17, 2010 #2 Απρίλιος 17, 2010 Καλησπέρα,οι εντολές mkdir και ps είναι εντολές του λειτουργικού και όχι κάποιες συναρτήσεις της γλώσσας C.Θα πρεπει να εκτελέσεις συνάρτηση της C για κλήση εντολών συστήματος (νομίζω είναι η συνάρτηση system).Το θέμα είναι οτι η συνάρτηση system δημιουργεί νέο process (οχι thread) στο σύστημα.Τέλος στο path των directories πρέπει να βάλεις το ~/ μπροστά (και όχι το /) για να δημιουργηθούν στο user directory και όχι στο root (/) directory του λειτουργικού που δεν έχεις πρόσβαση σαν απλός χρήστης (πχ mkdir ~/Documents/Ergasies).Απ'οτι βλέπω στην εκφώνηση λέει οτι το όνομα του νέου καταλόγου και του αρχείου θα δίνονται απο τη γραμμή εντολών (ορίσματα της main απ'οτι καταλαβαίνω).
JdCZT Απρίλιος 17, 2010 Author #3 Απρίλιος 17, 2010 Oποτε εχουμε System(" mkdir ~/Documents/Ergasies");Ομορφα ειναι μια αρχη...Την main σωστα δεν την εχω συνταξει για να δεχτει ορισματα;;;Παρακατω θα χρειαστω fopen και fread fwrite...σωστα δεν το εχω στο μυαλο μου;
backgman Απρίλιος 18, 2010 #4 Απρίλιος 18, 2010 Την main σωστα δεν την εχω συνταξει για να δεχτει ορισματα;;;Παρακατω θα χρειαστω fopen και fread fwrite...σωστα δεν το εχω στο μυαλο μου;Σωστά την έχεις συντάξει την main, αλλα τα ορίσματα που πέρνεις δε τα χρησιμοποιείς. Σκέψου οτι το directory και το όνομα του αρχείου θα τα πέρνεις σαν ορίσματα απο το χρήστη.Ναι για να διαβάσεις/γράψεις αρχείο θα χρειαστείς fopen/fclose και fread/fscanf (διάβασμα) και fwrite/fprintf (γράψιμο).
JdCZT Απρίλιος 21, 2010 Author #5 Απρίλιος 21, 2010 Παιδια εστω οτι ανοιγω ενα αρχειο dedomena.txt χρησιμοποιωντας ... fp=fopen("dedomena.txt","r");και εχει στην πρωτη γραμμη του αρχειου 100 και στη δευτερη 200.Πως θα διαβασω τη δευτερη κατευθειαν...παραβλεποντας την πρωτη;;;#include<stdio.h>int main(void){int a;FILE *fp; fp=fopen("dedomena.txt","r"); fscanf(fp,"\n%d",&a); /*edw exw valei \n alla moy epistrefei pali ti timi 100 dld ti prwti seira tou arxeiou...ginetai ayto pou thelw me tin fscanf; */printf("a=%d \n",a); fclose(fp); scanf("%d",&a);return 0;}
darien Απρίλιος 21, 2010 #6 Απρίλιος 21, 2010 Άμα βάλεις άλλο ένα fscanf κάτω από το πρώτο και κρατήσεις το δεύτερο;
JdCZT Απρίλιος 21, 2010 Author #7 Απρίλιος 21, 2010 Άμα βάλεις άλλο ένα fscanf κάτω από το πρώτο και κρατήσεις το δεύτερο;Εγραψες παιχτη αλλα για να διαβαζει τις επομενες γραμμες παραβλεποντας τις προηγουμενες χωρις να γεμισουμε το κωδικα με fscanf() τι κανουμε...Υπαρχει κατι αντιστοιχο του \n που μου διαφευγει;
darien Απρίλιος 21, 2010 #8 Απρίλιος 21, 2010 Μπορείς να βάλεις μια απλή δομή επανάληψης, θα δουλεύει λογικά.
JdCZT Απρίλιος 21, 2010 Author #9 Απρίλιος 21, 2010 Τελικα μου δουλεψε με τον παρακατω κωδικα...ακομα δεν καταλαβαινω πως αλλαζει τη γραμμη αλλα το κανει...Αν μπορει καποιος να το εξηγησει;;;#include<stdio.h>int main(void){int a,c; FILE *fp; fp=fopen("dedomena.txt","r"); do{ fscanf(fp,"%d",&a); printf("a=%d \n",a); }while ( (c=fgetc(fp)) != EOF); fclose(fp); scanf("%d",&a);return 0;}EDIT:Τελικα δεν αλλαζει γραμμη απλα στο dedomena.txt τα ειχα εγω το ενα κατω απο το αλλο και απλα διαβαζε το επομενο...δλδ100200300400Εαν στο dedomena.txt το γραψω ετσι:100 500200 300400Δεν παραβλεπει το 500...
Inglor Απρίλιος 22, 2010 #10 Απρίλιος 22, 2010 Βασικά όπως είπες δεν αλλάζει γραμμή. Για αυτό που γίνεται ευθύνεται η εντολή scanf που της λές ότι πρέπει να διαβάσει ΕΝΑ ακέραιο και να τον αποθηκεύσει στην διεύθυνση της μνήμης a.Όταν ξανακοιτάξει την εντολή τότε ο δείκτης που διατρέχει το αρχείο θα είναι ήδη μετά τον πρώτο αριθμό, και θα προσπαθήσει να βρεί τον επόμενο ακέραιο αριθμό.Η αλλαγή γραμμής αποτελείται από ένα ή δύο (ανάλογα το φορματ του αρχείου windows linux) και αγνοείται από το scanf.Ελπίζω να βοήθησα.
JdCZT Απρίλιος 23, 2010 Author #11 Απρίλιος 23, 2010 Βασικά όπως είπες δεν αλλάζει γραμμή. Για αυτό που γίνεται ευθύνεται η εντολή scanf που της λές ότι πρέπει να διαβάσει ΕΝΑ ακέραιο και να τον αποθηκεύσει στην διεύθυνση της μνήμης a.Όταν ξανακοιτάξει την εντολή τότε ο δείκτης που διατρέχει το αρχείο θα είναι ήδη μετά τον πρώτο αριθμό, και θα προσπαθήσει να βρεί τον επόμενο ακέραιο αριθμό.Η αλλαγή γραμμής αποτελείται από ένα ή δύο (ανάλογα το φορματ του αρχείου windows linux) και αγνοείται από το scanf.Ελπίζω να βοήθησα.Δεκτο το θεμα ειναι πως να του πω "αλλαξε γραμμη" εφοσων διαβασει τον πρωτο ακεραιο της γραμμης...
Inglor Απρίλιος 23, 2010 #12 Απρίλιος 23, 2010 Εξαρτάται τί ακριβώς θες να κάνεις.Μπορείς παράδειγμα να φτιάξεις ένα πίνακα ακεραίων με μεγάλο μήκος (πχ 500) και να αποθηκέυεις εκεί μέσα αυτά που διαβάζεις. Άρα αν θές τον τρίτο ακέραιο θα είναι το τρίτο στοιχείο στον πίνακα.Εναλλακτικά μπορείς να διαβάζεις byte προς byte το αρχείο.Ρίξε μια ματιά στις διάφορες functions που έχει η C για διάβασμα από αρχείο.http://www.mrx.net/c/readfunctions.htmlΣε διάβασμα χαρακτήρας προς χαρακτήρα μπορείς να του λές να διαβάζει μέχρι να βρει τον χαρακτήρα αλλαγής γραμμής (δες το παραπάνω ποστ μου για ένα ή δύο chars) και να αποθηκεύει αφού περάσουν πχ 3 γραμμές.Το διάβασμα τελειώνει όταν διαβάσει EOF (End Of File)
backgman Απρίλιος 24, 2010 #13 Απρίλιος 24, 2010 Μπορείς να χρησιμοποιήσεις την συνάρτηση fseek η οποία τοποθετεί τον file-pointer σε ένα συγκεκριμένο σημείομέσα στο αρχείο. Με την fseek βάλε τον file-pointer στην αρχή της δεύτερης γραμμής και ξεκίνα να διαβάζεις.Βέβαια για να χρησιμοποιήσεις την fseek πρέπει να ξέρεις πως είναι το αρχείο. Αν δε ξέρεις πόσα νούμεραπρέπει να παραβλέψεις απο την αρχή του αρχείου, τότε πρέπει να τα διαβάσεις όλα και να τα βάλεις σε πίνακα και μετά να πάρεις μόνο όσα χρειάζεσαι.Άλλος τρόπος (πιο δύσκολος) είναι να φτιάξεις parser. Δηλαδή να διαβάζεις όλο το αρχείο απο την αρχή και ανάλογα με τους χαρακτήρες που διαβάζεις (πχ τα κενά) να πέρνεις απόφαση αν θα κρατήσεις τον αριθμό η όχι.
JdCZT Απρίλιος 24, 2010 Author #14 Απρίλιος 24, 2010 Ευχασριστω παιδια για το ενδιαφερον και τη βοηθεια...Μαλλον η fgets() ειναι μονοδρομος μιας και η fscanf() δεν αλλαζει γραμμη...
JdCZT Μάϊος 10, 2010 Author #16 Μάϊος 10, 2010 Ξερετε αν εχω κανει δεσμευση μνημης και εχς κρατησει εναν pointer εστω shared_memory και του δωσω shared_memory=&array[0];ετσι ωστε να αποθηκεσω το 1 στοιχειο του πινακα μου στην αρχη του μπλοκ της δεσμευμενης μνημης....τα επομενα στοιχεια θα αποθηκευονται αυτοματα στον υπολοιπο χωρο της δεσμευμενης μνημης;;;ΔΛΔ αν εγω αργοτερα στο προγραμμα διαβασω τα περιεχομενα της δεσμευμενης μνημης στην ουσια θα διαβαζω τα στοιχεια του πινακα....;;;;
Recommended Posts
Archived
This topic is now archived and is closed to further replies.