PDA

Visualizza la versione completa : [C] Spostamento all'interno di file (seek)


Gacoment
16-04-2007, 18:22
Salve,
Ragazzi sto seguendo all'università un corso su programmazione linux ma ho un professore che durante le ore di laboratorio scompare dal laboratorio e dice: "fate voi".
Io per quanto mi riguarda uso già linux da tempo, però sulla programmazione non ho molte esperienze.
Lo stesso proff, che dovrebbe impararci le basi su linux e farci scrivere dei programmi, usa sul suo portatile una macchina virtuale per far partire Fedora e poi pretende che gli altri la installano XD. Avrei bisogno di qualche aiuto per ulteriori chiarimenti, perchè penso che fra di voi ci sia gente più professionale.

Mi stavo cimentando nell'uso dell'lseek, cioè una funzione che stabilisce la posizione corrente nel file volendo automentadone la dimensione di quest'ultimo.
Ora stavo provando a spostarmi di posizione in un file con l'aiuto dell'lseek anche nel caso in cui il file fosse vuoto e eventualmente scriverci qualcosa dallo standard input. Con questa chiamata: lseek(fd,15,SEEK_CUR) in pratica effettua la somma tra 15+SEEK_CUR (posizione corrente) non dovrebbe cmq far posizionare il cursore più avanti di qualche riga?
Ad Esempio qui perchè non mi fa scrivere qualche riga più avanti?


#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <stdio.h>

int main(void) {

int c,size,n,fd,buf[90];

if((fd=open("scrittura",O_CREAT| O_RDWR, 0644))<0)
printf("Errore apertura file");
size=read(STDIN_FILENO,buf,90);
if((lseek(fd,10,SEEK_END))<0)
printf("Errore lseek");
write(fd,buf,size);

printf("\nla read ha letto:%d\n\n",size-1);

close(fd);

exit(0);
}

Se apro il file con O_APPEND posso cambiare la posizione di scrittura con lseek?
Se apro il file con O_TRUNC mi dovrebbe cancellare tutto il contenuto?
lseek(fd,10,SEEK_END) ----> quando uso come secondo parametro un valore diverso da 0 nel documento mi stampa caratteri strani come se fossero buchi, ad esempio con il valore 10 mi mette dieci apici davanti alla stringa che ho inserito come input: ^@^@^@^@^@^@^@HTML.it. Perchè fa così? Non dovrebbe semplicemente lasciare scrivere più in la il testo inserito?

LeleFT
16-04-2007, 19:52
Ricorda che il linguaggio va specificato nel titolo.

Modifico io.


Ciao. :ciauz:

Gacoment
19-04-2007, 20:24
Ragazzi come mai nessuna riposta?

Cmq ho da porvi questo problema:


//ESERCIZIO:
//Scrivere da standard input

//Copiare il contenuto del primo file anche nel secondo, ma in maniera inversa





#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <stdio.h>





int main()

{

int fd1,fd2,buf[90],n,c;

if((fd1=open("INIZIO.txt", O_CREAT | O_RDWR | O_TRUNC, 0644)) < 0)
printf("Si è verificato un errore alla prima open");
if((fd2=open("FINE.txt", O_CREAT | O_RDWR | O_TRUNC, 0644)) <0)
printf("Si è verificato un errore alla seconda open");

n=read(STDIN_FILENO,buf,90); //leggo da Standard Input
write(fd1,buf,n); //scrivo sul primo file
n=lseek(fd1,0,SEEK_END); //mi posiziono alla fine del file

while(n>=0){
read(fd1,&c,1); //leggo un carattere dal file INIZIO.txt
write(fd2,&c,1); //scrivo un carattere su file FINE.txt
n=lseek(fd1,-1,SEEK_CUR);
}

close(fd1);
close(fd2);

exit(0);

}

In questo esercizio scrivo in ORIGINE.txt e poi quello scritto in esso lo copio in maniera inversa su FINE.txt. Ora siccome non mi è chiaro l'uso di lseek probabile che ho sbagliato qualcosa nei parametri. Mi date una mano, perfavore?

Loading