Jump to content



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


JdCZT

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

Καλησπέρα,

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

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

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

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

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

Oποτε εχουμε

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

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

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

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

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

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

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

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

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

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

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

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

Μπορείς να βάλεις μια απλή δομή επανάληψης, θα δουλεύει λογικά.

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


#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...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 3 weeks later...

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

shared_memory=&array[0];

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

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

Archived

This topic is now archived and is closed to further replies.

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

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.