Jump to content

Βοηθεια παιδες...


JdCZT
 Share

Recommended Posts

Παιδες πριν ξεκινησω ΔΕ θελω να μου λυσετε την ασκηση....απλα δεν ξερω απο που να ξεκινησω....Η ολη ασκηση πρεπει να τρεξει σε 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πο εντολες τι θα χρειαστω ;;;

Οτι μπορεσετε και οποιος μπορεσει ας απαντησει παιδια γιατι εχω χασει και τα αυγα και τα πασχαλια

Ευχαριστω προκαταβολικα...

post-4777-1416074410,9944_thumb.jpg

Link to comment
Share on other sites

Καλησπέρα,

οι εντολές mkdir και ps είναι εντολές του λειτουργικού και όχι κάποιες συναρτήσεις της γλώσσας C.

Θα πρεπει να εκτελέσεις συνάρτηση της C για κλήση εντολών συστήματος (νομίζω είναι η συνάρτηση system).

Το θέμα είναι οτι η συνάρτηση system δημιουργεί νέο process (οχι thread) στο σύστημα.

Τέλος στο path των directories πρέπει να βάλεις το ~/ μπροστά (και όχι το /) για να δημιουργηθούν στο user directory και όχι στο root (/) directory του λειτουργικού που δεν έχεις πρόσβαση σαν απλός χρήστης (πχ mkdir ~/Documents/Ergasies).

Απ'οτι βλέπω στην εκφώνηση λέει οτι το όνομα του νέου καταλόγου και του αρχείου θα δίνονται απο τη γραμμή εντολών (ορίσματα της main απ'οτι καταλαβαίνω).

Edited by backgman
Link to comment
Share on other sites

Oποτε εχουμε

System(" mkdir ~/Documents/Ergasies");

Ομορφα ειναι μια αρχη...

Την main σωστα δεν την εχω συνταξει για να δεχτει ορισματα;;;

Παρακατω θα χρειαστω fopen και fread fwrite...σωστα δεν το εχω στο μυαλο μου;

Link to comment
Share on other sites

Την main σωστα δεν την εχω συνταξει για να δεχτει ορισματα;;;

Παρακατω θα χρειαστω fopen και fread fwrite...σωστα δεν το εχω στο μυαλο μου;

Σωστά την έχεις συντάξει την main, αλλα τα ορίσματα που πέρνεις δε τα χρησιμοποιείς. Σκέψου οτι το directory και το όνομα του αρχείου θα τα πέρνεις σαν ορίσματα απο το χρήστη.

Ναι για να διαβάσεις/γράψεις αρχείο θα χρειαστείς fopen/fclose και fread/fscanf (διάβασμα) και fwrite/fprintf (γράψιμο).

Link to comment
Share on other sites

Παιδια εστω οτι ανοιγω ενα αρχειο 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

Άμα βάλεις άλλο ένα fscanf κάτω από το πρώτο και κρατήσεις το δεύτερο;

Εγραψες παιχτη αλλα για να διαβαζει τις επομενες γραμμες παραβλεποντας τις προηγουμενες χωρις να γεμισουμε το κωδικα με fscanf() τι κανουμε...Υπαρχει κατι αντιστοιχο του \n που μου διαφευγει;

Link to comment
Share on other sites

Τελικα μου δουλεψε με τον παρακατω κωδικα...ακομα δεν καταλαβαινω πως αλλαζει τη γραμμη αλλα το κανει...Αν μπορει καποιος να το εξηγησει;;;


#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 τα ειχα εγω το ενα κατω απο το αλλο και απλα διαβαζε το επομενο...δλδ

100

200

300

400

Εαν στο dedomena.txt το γραψω ετσι:

100 500

200

300

400

Δεν παραβλεπει το 500...

Edited by JdCZT
Link to comment
Share on other sites

Βασικά όπως είπες δεν αλλάζει γραμμή. Για αυτό που γίνεται ευθύνεται η εντολή scanf που της λές ότι πρέπει να διαβάσει ΕΝΑ ακέραιο και να τον αποθηκεύσει στην διεύθυνση της μνήμης a.

Όταν ξανακοιτάξει την εντολή τότε ο δείκτης που διατρέχει το αρχείο θα είναι ήδη μετά τον πρώτο αριθμό, και θα προσπαθήσει να βρεί τον επόμενο ακέραιο αριθμό.

Η αλλαγή γραμμής αποτελείται από ένα ή δύο (ανάλογα το φορματ του αρχείου windows linux) και αγνοείται από το scanf.

Ελπίζω να βοήθησα.

Link to comment
Share on other sites

Βασικά όπως είπες δεν αλλάζει γραμμή. Για αυτό που γίνεται ευθύνεται η εντολή scanf που της λές ότι πρέπει να διαβάσει ΕΝΑ ακέραιο και να τον αποθηκεύσει στην διεύθυνση της μνήμης a.

Όταν ξανακοιτάξει την εντολή τότε ο δείκτης που διατρέχει το αρχείο θα είναι ήδη μετά τον πρώτο αριθμό, και θα προσπαθήσει να βρεί τον επόμενο ακέραιο αριθμό.

Η αλλαγή γραμμής αποτελείται από ένα ή δύο (ανάλογα το φορματ του αρχείου windows linux) και αγνοείται από το scanf.

Ελπίζω να βοήθησα.

Δεκτο το θεμα ειναι πως να του πω "αλλαξε γραμμη" εφοσων διαβασει τον πρωτο ακεραιο της γραμμης...

Link to comment
Share on other sites

Εξαρτάται τί ακριβώς θες να κάνεις.

Μπορείς παράδειγμα να φτιάξεις ένα πίνακα ακεραίων με μεγάλο μήκος (πχ 500) και να αποθηκέυεις εκεί μέσα αυτά που διαβάζεις. Άρα αν θές τον τρίτο ακέραιο θα είναι το τρίτο στοιχείο στον πίνακα.

Εναλλακτικά μπορείς να διαβάζεις byte προς byte το αρχείο.

Ρίξε μια ματιά στις διάφορες functions που έχει η C για διάβασμα από αρχείο.

http://www.mrx.net/c/readfunctions.html

Σε διάβασμα χαρακτήρας προς χαρακτήρα μπορείς να του λές να διαβάζει μέχρι να βρει τον χαρακτήρα αλλαγής γραμμής (δες το παραπάνω ποστ μου για ένα ή δύο chars) και να αποθηκεύει αφού περάσουν πχ 3 γραμμές.

Το διάβασμα τελειώνει όταν διαβάσει EOF (End Of File)

  • Like 1
Link to comment
Share on other sites

Μπορείς να χρησιμοποιήσεις την συνάρτηση fseek η οποία τοποθετεί τον file-pointer σε ένα συγκεκριμένο σημείο

μέσα στο αρχείο. Με την fseek βάλε τον file-pointer στην αρχή της δεύτερης γραμμής και ξεκίνα να διαβάζεις.

Βέβαια για να χρησιμοποιήσεις την fseek πρέπει να ξέρεις πως είναι το αρχείο. Αν δε ξέρεις πόσα νούμερα

πρέπει να παραβλέψεις απο την αρχή του αρχείου, τότε πρέπει να τα διαβάσεις όλα και να τα βάλεις σε πίνακα

και μετά να πάρεις μόνο όσα χρειάζεσαι.

Άλλος τρόπος (πιο δύσκολος) είναι να φτιάξεις parser. Δηλαδή να διαβάζεις όλο το αρχείο απο την αρχή και

ανάλογα με τους χαρακτήρες που διαβάζεις (πχ τα κενά) να πέρνεις απόφαση αν θα κρατήσεις τον αριθμό η όχι.

  • Like 1
Link to comment
Share on other sites

Ευχασριστω παιδια για το ενδιαφερον και τη βοηθεια...Μαλλον η fgets() ειναι μονοδρομος μιας και η fscanf() δεν αλλαζει γραμμη...

Link to comment
Share on other sites

  • 3 weeks later...

Ξερετε αν εχω κανει δεσμευση μνημης και εχς κρατησει εναν pointer εστω shared_memory και του δωσω

shared_memory=&array[0];

ετσι ωστε να αποθηκεσω το 1 στοιχειο του πινακα μου στην αρχη του μπλοκ της δεσμευμενης μνημης....τα επομενα στοιχεια θα αποθηκευονται αυτοματα στον υπολοιπο χωρο της δεσμευμενης μνημης;;;

ΔΛΔ αν εγω αργοτερα στο προγραμμα διαβασω τα περιεχομενα της δεσμευμενης μνημης στην ουσια θα διαβαζω τα στοιχεια του πινακα....;;;;

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...