C:编辑文件以删除空字符:

时间:2012-10-22 23:54:39

标签: c fopen fclose fgetc

我认为这将是一项简单的任务,经过几次尝试后,我尝试了对temp的尝试和写入,而不是重新打开和重写:

#include <stdlib.h>
#include <stdio.h>
int main()
{
     FILE *f = fopen("main2.c","r");
     FILE *t = fopen("temp","w");
     int c;
     int count = 0;
     while((c = fgetc(f))!=EOF)
     {
          if(c)
          {
               fputc(c,t);
          }
          else
          {
               printf("null found\n");
          }
    }
    fclose(f);
    fclose(t);
    FILE *n = fopen("main2.c","w");
    FILE *w = fopen("temp","r");
    while((c=fgetc(w))!=EOF)
    {
          fputc(c,n);
    }
    fclose(n);
    fclose(w);
    return 0;
}

这只是吐了一堆汉字。基础字符编码可能是问题吗?或者我在这里只是一个总菜刀?

我的十六进制编辑器不允许我复制/粘贴。我不知道如何在原始状态下将文件放到此处,所以我将其压缩到谷歌文档中,如果你不能得到它立即通知我:

https://docs.google.com/open?id=0B4UPOuCR5uRGZzJQZUpVaktKYlk

编辑:等待在这里通过HxE编辑:

FF FE 23 00 69 00 6E 00 63 00 6C 00 75 00 64 00 65 00 20 00 3C 00 73 00 74 00 64 00   
6C  00 69 00 62 00 2E 00 68 00 3E 00 0D 00 0A 00 23 00 69 00 6E 00 63 00 6C 00 75 00 64 00 
65 00 20 00 3C 00 61 00 6C 00 6C 00 65 00 67 00 72 00 6F 00 2E 00 68 00 3E 00 0D 00 0A 00 
23 00 69 00 6E 00 63 00 6C 00 75 00 64 00 65 00 20 00 22 00 6D 00 6F 00

2 个答案:

答案 0 :(得分:3)

以二进制模式打开文件:

 FILE *f = fopen("main2.c","rb");
 FILE *t = fopen("temp","wb");

答案 1 :(得分:1)

您可能正在删除NULL字节,因为输入是UTF-16 Unicode。如果是这样,您还必须删除文件开头的字节顺序标记(BOM)。如果前两个字节是0xFF,0xFE,那么你有一个little-endian UTF-16文件。丢弃它们!如果将它们保留,则源中的每对ASCII字符将被视为组合的16位字符代码。随之而来的是奇怪。

同样,如果前两个字节是0xFE,0xFF,则文件是big-endian UTF-16,你还必须删除这两个字节,否则文件将再次被视为16位代码,只有高字节