2009-08-13 11 views
3

Est-il possible de supprimer les 10 derniers caractères d'un fichier texte?Supprimer les 10 derniers caractères d'un fichier texte

Merci

+3

ce qui est l'encodage du fichier? –

+0

Que diriez-vous d'une solution qui gère plus qu'un simple encodage de fichier? Je voudrais certainement upvote une telle réponse! :-) –

+1

@Alceu. En pur C90? Commencez par setlocale(), ouvrez un fichier temporaire, lisez le tampon. Utilisez mblen() pour savoir quels octets font partie d'un caractère. Copiez les caractères dans le fichier temporaire excepté les dix derniers. Remplissez le tampon et répétez sans oublier de sortir les dix derniers caractères du tampon précédent. Copiez ensuite le contenu du fichier temporaire dans le fichier d'origine. Possible mais fastidieux. En C95, utilisez simplement getwc() et putwc() pour une solution plus évidente. – AProgrammer

Répondre

9

Pour le codage d'un octet sur la plate-forme POSIX, vous pouvez utiliser quelque chose comme ceci (manipulation omise erreur):

FILE *file = fopen("filename", "a"); 
fseek(file, -10, SEEK_END); 
ftruncate(fileno(file), ftell(file)); // POSIX function 

Il ne va pas travailler pour les encodages avec des caractères de longueur variable, tels que UTF-8 et UTF-16.

+0

ftruncate() est-il portable? –

+0

cela ne fonctionne que si le fichier est ASCII. – Toad

+0

@Vijay ftruncate() est une fonction POSIX donc portable sur les plateformes POSIX. – qrdl

3

Pour quelque chose qui fonctionne sous Windows et que vous pourriez faire quelque chose comme ceci:

FILE* pFileIn = fopen("filenameIn", "rb"); 
FILE* pFileOut = fopen("filenameOut", "w+b"); 

fseek(pFileIn, -10, SEEK_END); 
long length = ftell(pFile); 

long blockSize = 16384; 
void* pBlock = malloc(blockSize); 
long dataLeft = length; 
while(dataLeft > 0) 
{ 
    long toCopy = (dataLeft > blockSize) ? blockSize : dataLeft; 

    fread(pBlock, toCopy, 1, pFileIn); 
    fwrite(pBlock, toCopy, 1, pFileOut); 

    dataLef  -= toCopy; 
} 

free(pBlock); 

fclose(pFileIn); 
fclose(pFileOut); 
Questions connexes