PDA

View Full Version : [C unix] lseek


stella_650
11-07-2008, 16:18
Ciao a tutti.
Sto facendo una semplice prova con lseek per copiare un carattere alla volta il contenuto di un file in un altro.

Ho il seguente codice:


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int fd,n,len,fd2;
char c;
if(argc!=3)
{
printf("Errore di esecuzione! <./out> <nomefile1> <nomefile2>\n");
exit(-1);
}

fd=open(argv[1],O_RDONLY);
fd2=open(argv[2],O_WRONLY);
n=lseek(fd,0,SEEK_SET); //mi sposto all'inizio del file
printf("Sono all'inizio del file in posizione %d\n",n);
len=lseek(fd,0L,2);//mi calcolo la lunghezza del file
lseek(fd2,0,SEEK_SET);//mi sposto all'inizio del secondo file
printf("La fine del file a %d\n",len);
while(n<len) //fintanto che c'è da leggere
{
printf("n prima in while vale %d\n",n);
read(fd,&c,1);
write(fd2,&c,1);
//spostati di una posizione nel file--->ERRORE!
n=lseek(fd,0,SEEK_CUR);
//printf("n vale %d\n",n);
}
close(fd);
close(fd2);
exit(0);
}

Come faccio nel while a spostarmi di una posizione in avanti con lseek??
Grazie a priori!

71104
11-07-2008, 21:17
devi spostarti avanti di un byte? e non va bene questo?

lseek(fd, 1, SEEK_CUR);



se ti restituisce errore dicci il valore di errno.

DanieleC88
12-07-2008, 01:03
n=lseek(fd,0,SEEK_CUR);
In effetti qui non ti sposti proprio, torni dove sei già... :D

stella_650
12-07-2008, 08:11
devi spostarti avanti di un byte? e non va bene questo?

lseek(fd, 1, SEEK_CUR);



se ti restituisce errore dicci il valore di errno.

Così se la lunghezza del contenuto del file vale per esempio 13, l'istruzione lseek(fd,1,SEEK_CUR) va a 14, cioè si sposta di 1 ma rispetto alla fine...

71104
12-07-2008, 10:57
Così se la lunghezza del contenuto del file vale per esempio 13, l'istruzione lseek(fd,1,SEEK_CUR) va a 14, cioè si sposta di 1 ma rispetto alla fine... SEEK_END sposta rispetto alla fine, SEEK_CUR sposta rispetto alla posizione corrente.

stella_650
12-07-2008, 12:11
SEEK_END sposta rispetto alla fine, SEEK_CUR sposta rispetto alla posizione corrente.

Facevo riferimento a quello che accade nel mio codice, mi trovo con quello che hai scritto però allora perchè non va avanti di uno ?

DanieleC88
12-07-2008, 13:36
Non so che input tu stia ricevendo, ma non hai bisogno della lseek() dopo la read():
READ(2) Linux Programmer's Manual READ(2)

NAME
read - read from a file descriptor

SYNOPSIS
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

DESCRIPTION
read() attempts to read up to count bytes from file descriptor fd into
the buffer starting at buf.

If count is zero, read() returns zero and has no other results. If
count is greater than SSIZE_MAX, the result is unspecified.

RETURN VALUE
On success, the number of bytes read is returned (zero indicates end of
file), and the file position is advanced by this number.

stella_650
12-07-2008, 15:16
Non so che input tu stia ricevendo, ma non hai bisogno della lseek() dopo la read():

e come ritorno il valore di n nel while per continuare a leggere?

DanieleC88
12-07-2008, 16:10
Io eviterei lseek() e farei una cosa del genere:
size_t uBytesRead = 0;

while (uBytesRead < uRequestedSize)
{
size_t uCount;

uCount = read(fd, &c, 1);
if (uCount <= 0)
{
break;
}

uBytesRead += uCount;
write(fd, &c, 1);
}
Userei questo metodo perché così controlli subito che la lettura non abbia incontrato un errore o un EOF, nel qual caso interrompi il ciclo, e non vai ad impelagarti con lseek().