2009-08-13 57 views
3

有什么办法从文本文件中删除最后10个字符?从文本文件中删除最后10个字符

感谢

+3

有什么文件编码? – 2009-08-13 09:55:09

+0

如何处理不只一种文件编码的解决方案?我肯定会赞成这样的答案! :-) – 2009-08-13 11:12:12

+1

@Alceu。在纯粹的C90?由setlocale()开始,打开一个临时文件,读取缓冲区。使用mblen()知道哪些字节是一个字符的一部分。将字符复制到除最后十个之外的临时文件。重新填充缓冲区并重复,不要忘记输出前一个缓冲区的最后十个字符。然后将临时文件的内容复制到原始文件的内容。可能但很乏味。在C95中,只需使用getwc()和putwc()来获得更明显的解决方案。 – AProgrammer 2009-08-13 12:40:54

回答

9

有关POSIX平台,你可以使用这样的单字节编码(处理省略错误):

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

它是不会与可变长度的字符编码工作,如UTF-8和UTF-16。

+0

ftruncate()是否可移植? – 2009-08-13 10:14:16

+0

这只适用于文件为ascii的情况。 – Toad 2009-08-13 10:14:31

+0

@Vijay ftruncate()是POSIX函数,因此它可以移植到POSIX平台。 – qrdl 2009-08-13 10:25:20

3

的东西,会在Windows下工作,以及你可以做这样的事情:

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); 
相关问题