balzarini ha scritto:
se proprio si vuole farlo tutto in c, allora non puoi aprire in modalita` "w" il file e leggerlo perche`
se usi "w" te lo cancella...andava letto tutto alla prima apertura usando "rw" (che spreco di
memoria...) e scritto colla fwrite che dici tu...e poi e` c non c++ e non potresti mettere il
"char mybuf[lengthToSave]" li` perche` le dichiarazioni vanno all'inizio delle funzioni
e non puoi nemmeno fare array con dimensione variabile ...
che dire, la mia variante non é ansi ma funziona (come la tua del resto);

mi sembrava stravagante usare la shell per qualcosa che si puó fare senza troppa fatica pure in c

;inoltre il buffer non é una array con dimensione variabile, é semplicmente una variabile semidinamica, che viene referenziata indirettamente in compilazione e durante l'esecuzione viene allocata in cima al record di attivazione della funzione
EDIT: nel caso servisse a qualcuno anche solo per curiositá ecco la versione del programmino che compila con
Codice: Seleziona tutto
#include<stdio.h>
int main( int argc, char **argv)
{ int index;
FILE *fp,*fout;
long lengthToSave=0;
long lengthToDelete;
char lastTestedChar;
for( index=1; index<argc; index++)
{
fp = fopen( argv[ index], "r");
if( fp == NULL )
continue;
for( lengthToDelete=-1L;; lengthToDelete--)
{
if( fseek( fp, lengthToDelete, SEEK_END) )
{
lengthToSave = 0L;
break;
}
if( fread( &lastTestedChar, 1, 1, fp) == 0)
{
lengthToSave = 0L;
break;
}
if( (lastTestedChar == '\n') || (lastTestedChar == '\r') ){
lengthToSave = ftell( fp);
}
else
break;
}
if( lengthToSave > 1L )
{
lengthToSave--;
fseek( fp, 0, SEEK_SET);
fout = fopen(argv[ index], "w");
char mybuf[lengthToSave];
fread(mybuf,1,lengthToSave,fp);
fwrite(mybuf,1,lengthToSave,fout);
fclose(fp);
fclose(fout);
}
}
return 0;
}