0

我认为这将是一项简单的任务,经过几次尝试后,我尝试尝试将经过验证的真实写入临时文件,而不是重新打开并重写:

#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
4

2 回答 2

3

以二进制模式打开文件:

 FILE *f = fopen("main2.c","rb");
 FILE *t = fopen("temp","wb");
于 2012-10-22T23:59:52.723 回答
1

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

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

于 2012-10-23T02:17:32.330 回答