PDA

Visualizza la versione completa : programma in c sotto linux


s_p_81
21-10-2008, 12:05
salve ragazzi posto qui il codice di un esercizio ke nn vuole proprio funzionare...praticamente devo leggere i primi 3 caratteri dispari di ogni file.txt e memorizzare in un buffer e copiare i caratteri del buffer in un file.txt in modo contrario e poi normale...ma nel buffer nn riesco a memorizzarli

int main(int argc, char *argv[])
{
struct stat s,s1;
struct dirent *dir;
DIR *d;
char *nome,c,car;
int i,n,fd;
char *buf;
int esiste=0;
int fd1;

d=opendir(argv[1]);
while((dir=readdir(d))!=NULL)
{
stat(dir->d_name,&s);
nome=dir->d_name;
if(S_ISREG(s.st_mode))
{
if(strstr(dir->d_name,".txt"))
{
printf("i file txt esistenti sono: %s\n",nome);
fd=open(nome,O_RDWR,0666);
while((read(fd,&c,1))>0)
{
for(i=0;i<6;i++)
{
if(c%2!=0)
{
fd1=open("byteletti.txt", O_RDWR | O_CREAT | O_TRUNC , 0666);
buf=malloc(s.st_size);
write(fd1,buf,s.st_size);
esiste=1;
}
}
}
}
}
}
if(esiste==1)
{
int fd2=open("temp", O_RDWR | O_CREAT | O_TRUNC , 0666);
fd1=open("byteletti.txt", O_RDWR );
int lunghezza=lseek(fd1,0,SEEK_END);
int mezza=lunghezza/2;
n=lseek(fd1,0,SEEK_SET);
while(n<=mezza)
{
read(fd1,buf,1);
write(fd2,buf,1);
lseek(fd1,1,SEEK_CUR);
}
n=lseek(fd1,-1,SEEK_END);
while(n>=mezza)
{
read(fd1,buf,1);
write(fd2,buf,1);
lseek(fd1,-2,SEEK_CUR);
}
}


}

grazie

MacApp
21-10-2008, 12:58
Se speri in un aiuto ti conviene, racchiudere tra i tag {code} (al posto delle graffe le quadre) e compilabile il codice.

A prima vista in ogni modo si vede che non controlli possibili errori restituiti da "opendir", "malloc", "open", "write" ecc..

s_p_81
21-10-2008, 13:08
scusa non ho capito cosa intendi per chiudere il codice nei tag code
inoltre siccome programma da poco sotto linux come posso controllare gli errori restituiti da write , malloc e etc.

MacApp
21-10-2008, 13:16
Originariamente inviato da s_p_81
scusa non ho capito cosa intendi per chiudere il codice nei tag code

e' ben spiegato nel regolamenteo di questo stesso forum

Originariamente inviato da s_p_81
inoltre siccome programma da poco sotto linux come posso controllare gli errori restituiti da write , malloc e etc.
direttamente leggendo la documentazione delle funzioni che utilizzi:

Ad esempio:


$ man 2 write
...
RETURN VALUES
Upon successful completion the number of bytes which were written is
returned. Otherwise a -1 is returned and the global variable errno is
set to indicate the error.
...

s_p_81
21-10-2008, 13:30
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/file.h>
#include<sys/wait.h>
#include<dirent.h>
#include<fcntl.h>
#include<unistd.h>

int main(int argc, char *argv[])
{
struct stat s,s1;
struct dirent *dir;
DIR *d;
char *nome,c,car;
int i,n,fd;
char *buf;
int esiste=0;
int fd1;

d=opendir(argv[1]);
while((dir=readdir(d))!=NULL)
{
stat(dir->d_name,&s);
nome=dir->d_name;
if(S_ISREG(s.st_mode))
{
if(strstr(dir->d_name,".txt"))
{
printf("i file txt esistenti sono: %s\n",nome);
fd=open(nome,O_RDWR,0666);
while((read(fd,&c,1))>0)
{
for(i=0;i<6;i++)
{
if(c%2!=0)
{
fd1=open("byteletti.txt", O_RDWR | O_CREAT | O_TRUNC , 0666);
buf=malloc(s.st_size);
write(fd1,buf,s.st_size);
esiste=1;
}
}
}
}
}
}
if(esiste==1)
{
int fd2=open("temp", O_RDWR | O_CREAT | O_TRUNC , 0666);
fd1=open("byteletti.txt", O_RDWR );
int lunghezza=lseek(fd1,0,SEEK_END);
int mezza=lunghezza/2;
n=lseek(fd1,0,SEEK_SET);
while(n<=mezza)
{
read(fd1,buf,1);
write(fd2,buf,1);
lseek(fd1,1,SEEK_CUR);
}
n=lseek(fd1,-1,SEEK_END);
while(n>=mezza)
{
read(fd1,buf,1);
write(fd2,buf,1);
lseek(fd1,-2,SEEK_CUR);
}
}
}


grazie dovrò leggermi anche attentamente il man

s_p_81
21-10-2008, 13:33
il programma in esecuzione non mi da errori,ma comunque il problema sta nel memorizzare i dati all'interno del buffer...li memorizza strani caratteri e non i caratteri ke dovrebbe memorizzare

MacApp
21-10-2008, 15:31
Originariamente inviato da s_p_81
il programma in esecuzione non mi da errori
Come fai a dire che non ti da errori? Nel tuo codice non li controlli.

s_p_81
22-10-2008, 00:36
quando lo eseguo sotto linux non mi da errori...crea anche il file byteletti è mette i carateri all'interno,ma come ti ho detto prima usa simboli strani.ciao

s_p_81
22-10-2008, 00:37
tu non riesci ad eseguirlo sotto windows..provalo per favore.grazie

MacApp
22-10-2008, 11:40
Devo ripetermi? Come fai a dire che non da errori visto che NON li controlli?

Loading