Page 1 of 1

πρόγραμμα σε C

Posted: Fri Nov 16, 2007 4:38 pm
by VASSO
Γεια σας εχω μια εργασια με θέμα: Γράψτε ένα πρόγραμμα σε C που να προσομοιώνει την εντολή ls όταν αυτή εκτελείται με την παράμετρο -l. Το πρόγραμμά σας, όταν εκτελείται χωρίς ορίσματα, θα πρέπει να εμφανίζει τις πληροφορίες για όλα τα αρχεία του τρέχοντος καταλόγου. Εναλλακτικά, αν λάβει σαν όρισμα το όνομα ενός αρχείου, να εμφανίζει πληροφορίες μονάχα για το αρχείο αυτό. Προαιρετικά, το αποτέλεσμα της παραπάνω εκτέλεσης να γράφεται και στο αρχείο eksodos.txt.
ο κώδικας που έχω γραψει είναι ο εξής:

Code: Select all

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

int getsize(char *);  
int numberoflinks(char *); 
int mode(char *); 
int userid(char *); 
int groupid(char *);// 
struct stat attrib;

main(int argc,char *argv[])  { 
struct stat attrib;
argv[1]=”ls”; 
argv[2]=”-l”; 
if (argc!=4)  
{
printf(“lathos arithmos orismaton\n”);
exit(1);
}
if(argv[1]!=”ls”)
printf(“lathos entoli”);
exit(2);
}
if(argv[2]!=”-l”) 
printf(“lathos entoli”);
exit(3);
}
if (stat(argv[1],&attrib) == -1)  
{
printf(“error stat\n”);
exit(4);
}

printf(“%d ”,getsize(argv[3]));
printf(“%s ”,argv[3]);
printf(“%d ”,numberoflinks(argv[3]));
printf(“%d ”,mode(argv[3]));
printf(“%d ”,userid(argv[3]));
printf(“%d ”,groupid(argv[3]));
if(S_ISBLK(attrib.st_mode))
printf(“block special file\n”);
else if(S_ISCHR(attrib.st_mode))
printf(“character special file\n”);
else if(S_ISFIFO(attrib.st_mode))
printf(“fifo or pipe\n”);
else if(S_ISDIR(attrib.st_mode))
printf(“directory\n”);
else if(S_ISREG(attrib.st_mode))
printf(“regular file\n”);
}
int getsize(char *filename) 
{
struct stat attrib;
stat(filename,&attrib);
return attrib.st_size);
}

int numberoflinks(char *filename) 
{
struct stat attrib;
stat(filename,&attrib);
return attrib.st_nlink);
}
struct stat attrib;
stat(filename,&attrib);
return attrib.st_mode);
}
int  userid(char *filename) 
{
int mode(char *filename) 
{
struct stat attrib;
stat(filename,&attrib);
return attrib.st_mode);
}
int  userid(char *filename) 
{
struct stat attrib;
stat(filename,&attrib);
return attrib.st_uid);
}
int groupid(char *filename) 
{
struct stat attrib;
stat(filename,&attrib);
return attrib.st_gid);
}
Αλλα δεν είμαι σίγουρη! Μπόρει κάποιος να με βοηθήσει;

Posted: Fri Nov 16, 2007 5:24 pm
by *estrngd
τον έχεις γράψει;

Posted: Fri Nov 16, 2007 8:26 pm
by VASSO
Εννοείς αν τον έχω τρέξει

Posted: Sat Nov 17, 2007 12:28 am
by tsilochr
από περιέργεια, VASSO από ποιό τμήμα είσαι? η άσκηση σου μυρίζει έντονα άσκηση λειτουργικών στο ΕΚΠΑ και στην ΑΣΟΕΕ δεν κάνουμε (δυστυχώς) τέτοια στα λειτουργικά.

το βλέπω δύσκολο να σε βοηθά κανείς , εγώ προσωπικά δεν ξέρω τόσο καλή c

Posted: Sat Nov 17, 2007 12:28 pm
by VASSO
Και εγω δεν γνωριζω καλα c. Απλά βοηθάω μια φιλη μου (απο τει) με την εργασία της και ηθελα μια δευτερη γνωμη.

Posted: Sun Nov 18, 2007 12:29 am
by elsupreme
Επόμενη φορά, πρόσεχε λίγο όταν κάνεις copy-paste, αυτά που έγραψες δεν έχουν κανένα συντακτικό νόημα, πόσο μάλλον να δουλεύουν.
Δοκίμασε αυτό :

Code: Select all

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

int getsize(char *); 
int numberoflinks(char *);
int mode(char *);
int userid(char *);
int groupid(char *);
struct stat attrib;

main(int argc,char *argv[])  
{
	struct stat attrib;
	//argv[1]=”ls”;
	//argv[2]=”-l”;
	if (argc!=4) 
	{
		printf(“lathos arithmos orismaton\n”);
		exit(1);
	}
	else if(argv[1]!=”ls”)
	{
		printf(“lathos entoli”);
		exit(2);
	}
	else if(argv[2]!=”-l”)
	{
		printf(“lathos entoli”);
		exit(3);
	}
	else if (stat(argv[1],&attrib) == -1) 
	{
		printf(“error stat\n”);
		exit(4);
	}
	printf(“%d ”,getsize(argv[3]));
	printf(“%s ”,argv[3]);
	printf(“%d ”,numberoflinks(argv[3]));
	printf(“%d ”,mode(argv[3]));
	printf(“%d ”,userid(argv[3]));
	printf(“%d ”,groupid(argv[3]));
	if(S_ISBLK(attrib.st_mode))printf(“block special file\n”);
	else if(S_ISCHR(attrib.st_mode))printf(“character special file\n”);
	else if(S_ISFIFO(attrib.st_mode))printf(“fifo or pipe\n”);
	else if(S_ISDIR(attrib.st_mode))printf(“directory\n”);
	else if(S_ISREG(attrib.st_mode))printf(“regular file\n”);
}
int getsize(char *filename)
{
	struct stat attrib;
	stat(filename,&attrib);
	return attrib.st_size();
}

int numberoflinks(char *filename)
{
	struct stat attrib;
	stat(filename,&attrib);
	return attrib.st_nlink();
}
int mode(char *filename)
{
	struct stat attrib;
	stat(filename,&attrib);
	return attrib.st_mode();
}
int  userid(char *filename)
{
	struct stat attrib;
	stat(filename,&attrib);
	return attrib.st_uid();
}
int groupid(char *filename)
{
	struct stat attrib;
	stat(filename,&attrib);
	return attrib.st_gid();
}
Και σημείωσε το εξής : εγώ δεν έγραψα τίποτα επιπλέον, απλώς άλλαξα το κείμενο που μου έδωσες. Δεν έχω συμπεριλάβει (ανάμεσα σε άλλα ενδεχομένως) και τον ορισμό του struct που χρησιμοποιεί ο κώδικας σε διάφορα σημεία, το οποίο χρειάζεται.

edit : thx Punisher,Klefth τα άλλαξα.

Posted: Sun Nov 18, 2007 1:05 am
by The Punisher

Code: Select all

return attrib.st_nlink); 
αυτό ακόμη δε δουλέυει ... κάντο

Code: Select all

return attrib.st_nlink(); 

Posted: Sun Nov 18, 2007 2:09 am
by Klefths
Σε όλα τα return υπάρχει το ίδιο λάθος με αυτό που επισημάνει ο Punisher.

Επίσης δε χρειάζεται να γράψεις τον ορισμό του struct γιατί αν πρόσεξες το έχει κάνει include, συγκεκριμένα #include<sys/stat.h>

Posted: Sun Nov 18, 2007 1:24 pm
by VASSO
Ναι όντως είχα κάνει copy-paste στα γρηγορα και δεν το πρόσεξα μετά. Ευχαριστώ πολύ για τη βοήθειά σας.