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πο εντολες τι θα χρειαστω ;;; Οτι μπορεσετε και οποιος μπορεσει ας απαντησει παιδια γιατι εχω χασει και τα αυγα και τα πασχαλια Ευχαριστω προκαταβολικα... Link to comment Share on other sites More sharing options...
backgman Απρίλιος 17, 2010 #2 Κοινοποίηση Απρίλιος 17, 2010 Καλησπέρα,οι εντολές mkdir και ps είναι εντολές του λειτουργικού και όχι κάποιες συναρτήσεις της γλώσσας C.Θα πρεπει να εκτελέσεις συνάρτηση της C για κλήση εντολών συστήματος (νομίζω είναι η συνάρτηση system).Το θέμα είναι οτι η συνάρτηση system δημιουργεί νέο process (οχι thread) στο σύστημα.Τέλος στο path των directories πρέπει να βάλεις το ~/ μπροστά (και όχι το /) για να δημιουργηθούν στο user directory και όχι στο root (/) directory του λειτουργικού που δεν έχεις πρόσβαση σαν απλός χρήστης (πχ mkdir ~/Documents/Ergasies).Απ'οτι βλέπω στην εκφώνηση λέει οτι το όνομα του νέου καταλόγου και του αρχείου θα δίνονται απο τη γραμμή εντολών (ορίσματα της main απ'οτι καταλαβαίνω). Link to comment Share on other sites More sharing options...
JdCZT Απρίλιος 17, 2010 Author #3 Κοινοποίηση Απρίλιος 17, 2010 Oποτε εχουμε System(" mkdir ~/Documents/Ergasies");Ομορφα ειναι μια αρχη...Την main σωστα δεν την εχω συνταξει για να δεχτει ορισματα;;;Παρακατω θα χρειαστω fopen και fread fwrite...σωστα δεν το εχω στο μυαλο μου; Link to comment Share on other sites More sharing options...
backgman Απρίλιος 18, 2010 #4 Κοινοποίηση Απρίλιος 18, 2010 Την main σωστα δεν την εχω συνταξει για να δεχτει ορισματα;;;Παρακατω θα χρειαστω fopen και fread fwrite...σωστα δεν το εχω στο μυαλο μου;Σωστά την έχεις συντάξει την main, αλλα τα ορίσματα που πέρνεις δε τα χρησιμοποιείς. Σκέψου οτι το directory και το όνομα του αρχείου θα τα πέρνεις σαν ορίσματα απο το χρήστη.Ναι για να διαβάσεις/γράψεις αρχείο θα χρειαστείς fopen/fclose και fread/fscanf (διάβασμα) και fwrite/fprintf (γράψιμο). Link to comment Share on other sites More sharing options...
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;} Link to comment Share on other sites More sharing options...
darien Απρίλιος 21, 2010 #6 Κοινοποίηση Απρίλιος 21, 2010 Άμα βάλεις άλλο ένα fscanf κάτω από το πρώτο και κρατήσεις το δεύτερο; Link to comment Share on other sites More sharing options...
JdCZT Απρίλιος 21, 2010 Author #7 Κοινοποίηση Απρίλιος 21, 2010 Άμα βάλεις άλλο ένα fscanf κάτω από το πρώτο και κρατήσεις το δεύτερο;Εγραψες παιχτη αλλα για να διαβαζει τις επομενες γραμμες παραβλεποντας τις προηγουμενες χωρις να γεμισουμε το κωδικα με fscanf() τι κανουμε...Υπαρχει κατι αντιστοιχο του \n που μου διαφευγει; Link to comment Share on other sites More sharing options...
darien Απρίλιος 21, 2010 #8 Κοινοποίηση Απρίλιος 21, 2010 Μπορείς να βάλεις μια απλή δομή επανάληψης, θα δουλεύει λογικά. Link to comment Share on other sites More sharing options...
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... Link to comment Share on other sites More sharing options...
Inglor Απρίλιος 22, 2010 #10 Κοινοποίηση Απρίλιος 22, 2010 Βασικά όπως είπες δεν αλλάζει γραμμή. Για αυτό που γίνεται ευθύνεται η εντολή scanf που της λές ότι πρέπει να διαβάσει ΕΝΑ ακέραιο και να τον αποθηκεύσει στην διεύθυνση της μνήμης a.Όταν ξανακοιτάξει την εντολή τότε ο δείκτης που διατρέχει το αρχείο θα είναι ήδη μετά τον πρώτο αριθμό, και θα προσπαθήσει να βρεί τον επόμενο ακέραιο αριθμό.Η αλλαγή γραμμής αποτελείται από ένα ή δύο (ανάλογα το φορματ του αρχείου windows linux) και αγνοείται από το scanf.Ελπίζω να βοήθησα. Link to comment Share on other sites More sharing options...
JdCZT Απρίλιος 23, 2010 Author #11 Κοινοποίηση Απρίλιος 23, 2010 Βασικά όπως είπες δεν αλλάζει γραμμή. Για αυτό που γίνεται ευθύνεται η εντολή scanf που της λές ότι πρέπει να διαβάσει ΕΝΑ ακέραιο και να τον αποθηκεύσει στην διεύθυνση της μνήμης a.Όταν ξανακοιτάξει την εντολή τότε ο δείκτης που διατρέχει το αρχείο θα είναι ήδη μετά τον πρώτο αριθμό, και θα προσπαθήσει να βρεί τον επόμενο ακέραιο αριθμό.Η αλλαγή γραμμής αποτελείται από ένα ή δύο (ανάλογα το φορματ του αρχείου windows linux) και αγνοείται από το scanf.Ελπίζω να βοήθησα.Δεκτο το θεμα ειναι πως να του πω "αλλαξε γραμμη" εφοσων διαβασει τον πρωτο ακεραιο της γραμμης... Link to comment Share on other sites More sharing options...
Inglor Απρίλιος 23, 2010 #12 Κοινοποίηση Απρίλιος 23, 2010 Εξαρτάται τί ακριβώς θες να κάνεις.Μπορείς παράδειγμα να φτιάξεις ένα πίνακα ακεραίων με μεγάλο μήκος (πχ 500) και να αποθηκέυεις εκεί μέσα αυτά που διαβάζεις. Άρα αν θές τον τρίτο ακέραιο θα είναι το τρίτο στοιχείο στον πίνακα.Εναλλακτικά μπορείς να διαβάζεις byte προς byte το αρχείο.Ρίξε μια ματιά στις διάφορες functions που έχει η C για διάβασμα από αρχείο.http://www.mrx.net/c/readfunctions.htmlΣε διάβασμα χαρακτήρας προς χαρακτήρα μπορείς να του λές να διαβάζει μέχρι να βρει τον χαρακτήρα αλλαγής γραμμής (δες το παραπάνω ποστ μου για ένα ή δύο chars) και να αποθηκεύει αφού περάσουν πχ 3 γραμμές.Το διάβασμα τελειώνει όταν διαβάσει EOF (End Of File) Link to comment Share on other sites More sharing options...
backgman Απρίλιος 24, 2010 #13 Κοινοποίηση Απρίλιος 24, 2010 Μπορείς να χρησιμοποιήσεις την συνάρτηση fseek η οποία τοποθετεί τον file-pointer σε ένα συγκεκριμένο σημείομέσα στο αρχείο. Με την fseek βάλε τον file-pointer στην αρχή της δεύτερης γραμμής και ξεκίνα να διαβάζεις.Βέβαια για να χρησιμοποιήσεις την fseek πρέπει να ξέρεις πως είναι το αρχείο. Αν δε ξέρεις πόσα νούμεραπρέπει να παραβλέψεις απο την αρχή του αρχείου, τότε πρέπει να τα διαβάσεις όλα και να τα βάλεις σε πίνακα και μετά να πάρεις μόνο όσα χρειάζεσαι.Άλλος τρόπος (πιο δύσκολος) είναι να φτιάξεις parser. Δηλαδή να διαβάζεις όλο το αρχείο απο την αρχή και ανάλογα με τους χαρακτήρες που διαβάζεις (πχ τα κενά) να πέρνεις απόφαση αν θα κρατήσεις τον αριθμό η όχι. Link to comment Share on other sites More sharing options...
JdCZT Απρίλιος 24, 2010 Author #14 Κοινοποίηση Απρίλιος 24, 2010 Ευχασριστω παιδια για το ενδιαφερον και τη βοηθεια...Μαλλον η fgets() ειναι μονοδρομος μιας και η fscanf() δεν αλλαζει γραμμη... Link to comment Share on other sites More sharing options...
apostglen46 Απρίλιος 24, 2010 #15 Κοινοποίηση Απρίλιος 24, 2010 στο di εισαι? -- sorry ακυρο Link to comment Share on other sites More sharing options...
JdCZT Μάϊος 10, 2010 Author #16 Κοινοποίηση Μάϊος 10, 2010 Ξερετε αν εχω κανει δεσμευση μνημης και εχς κρατησει εναν pointer εστω shared_memory και του δωσω shared_memory=&array[0];ετσι ωστε να αποθηκεσω το 1 στοιχειο του πινακα μου στην αρχη του μπλοκ της δεσμευμενης μνημης....τα επομενα στοιχεια θα αποθηκευονται αυτοματα στον υπολοιπο χωρο της δεσμευμενης μνημης;;;ΔΛΔ αν εγω αργοτερα στο προγραμμα διαβασω τα περιεχομενα της δεσμευμενης μνημης στην ουσια θα διαβαζω τα στοιχεια του πινακα....;;;; Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.