PDA

Visualizza la versione completa : [C] Copia testo su nuova linea nel file


tina8
12-02-2011, 11:04
Ciao a tutti, potete dirmi perchŔ se il programma seguente scrive su un file vuoto i caratteri sono scritti a partire dalla prima linea altrimenti se Ŕ giÓ presente del testo il nuovo testo viene copiato su una nuova linea, ad esempio:
1. file vuoto
123abcd
2. File giÓ scritto
123abcdefghilm
123abcd





#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
char *ptr;
FILE *prova;
DIR *dp;
struct dirent *dirp;
struct stat buf;
int size, dim,nc;
char directory[526];
char *directoryi;
char *stringa;
char *stringa2;
char *filename="top.end";

getcwd(directory, sizeof(directory));
directoryi=(char *)malloc(strlen(directory)+1);
strcpy(directoryi,directory);

while(strcmp(directory,"/")!=0){

getcwd(directory, sizeof(directory));
printf("%s\n", directory);
printf("%s\n", directoryi);


if ( (dp = opendir(directory)) == NULL){
printf("can't open %s", argv[1]);
exit(-1);
}
while ( (dirp = readdir(dp)) != NULL){
//printf("File %s\n", dirp->d_name);
if(strcmp(dirp->d_name,"top.end")==0){
printf("File trovato %s\n",dirp->d_name);
printf("File %s\n", dirp->d_name);
printf("\npercorso %s \n",directory);
if ((prova=fopen(filename,"a+"))==NULL){
printf("non posso aprire il file");
exit(1);
}
rewind(prova);
stringa=(char *)malloc(11);
fgets(stringa,11,prova);
if (ferror(prova))
perror("errore apertura file");
printf("primi 10 caratteri di top.end\n %s\n",stringa);
if (fseek(prova,0,SEEK_END)!=0){//posiziono lo stream alla fine del file
fprintf(stderr,"\n errore fseek");
exit(1);
}
fputs(stringa,prova);//copio i 10 caratteri in coda
if (ferror(prova))
perror("errore apertura file");
dim= stat(filename,&buf);
size=buf.st_size printf("dimensione file %lld\n",(long long)buf.st_size);
rewind(prova);
stringa=realloc(stringa,size+1 printf("File top.end con i primi 10 caratteri copiati in coda:\n");
while (!feof(prova)){ fgets(stringa,size+1,prova); if (ferror(prova))
perror("errore apertura file");
printf(" %s",stringa);
}
fclose(prova);


exit(0);
}
}chdir("..");
}


printf("File Top.end non ├Ę stato trovato, lo crea nela directory corrente\n");
chdir(directoryi);
printf("\npercorso %s \n",directoryi);
if ((prova=fopen(filename,"a+"))==NULL){
printf("non posso aprire il file");
exit(1);
}
fputs(directoryi,prova);
rewind(prova);
stringa2=(char *)malloc(strlen(directoryi)+1);
while (!feof(prova)){ //ciclo continuo fino alla fine del file dovuta all'uscita di fgets
fgets(stringa2,size+1,prova); //incaso incontra carattere di nuovariga()
if (ferror(prova))
perror("errore apertura file");
printf(" %s",stringa2);

}
fclose(prova);





}





Grazieeeeeeeee :ciauz:

lolide
12-02-2011, 11:17
Originariamente inviato da tina8
Ciao a tutti, potete dirmi perchŔ se il programma seguente scrive su un file vuoto i caratteri sono scritti a partire dalla prima linea altrimenti se Ŕ giÓ presente del testo il nuovo testo viene copiato su una nuova linea, ad esempio:
1. file vuoto
123abcd
2. File giÓ scritto
123abcdefghilm
123abcd





...
if ((prova=fopen(filename,"a+"))==NULL)
...


Grazieeeeeeeee :ciauz:

Succede perchŔ apri il file in modalitÓ append+ (a+), il che vuol dire che se il file non esiste lo crea e se esiste la stringa che inserisci la "appende" al file (la inserisce alla fine)

Cosa vorresti fare tu ?

tina8
12-02-2011, 12:04
Grazie della risposta, provo a spiegartelo con un esempio, ipotizziamo che il file di partenza sia esistente e contenga il seguente testo scritto da me:

1234abcdefgh

io voglio copiare i primi 10 caratteri e riscriverli in coda al testo giÓ presente ossia vorrei un risultato del genere:
1234abcdefgh1234abcde invece ottengo:

1234abcdefgh
1234abcde (questa stringa la scrive a capo)

inoltre dopo il primo inserimento funziona perfettamente ossia continua a scrivere sullo stesso rigo :

1234abcdefgh
1234abcde1234abcde

Ipotizzo che il problema sia solo alla prima scrittura sul file. Spero di essere stata chiara. Grazie

lolide
12-02-2011, 12:11
Non Ŕ un problema.
E' solo che se apri il file in append lui ovviamente inserisce una newline alla fine del file e poi ti scrive la riga.
Se scrivi un'altra riga senza riaprire il file, non mette la newline e funziona.

Per fare quello che vuoi fare te, apri il file in scrittura normale ("w+") e vai alla fine del file con


fseek(puntatore_file, 0L, SEEK_END);

Poi scrivi la stringa.

:ciauz:

Loading