【问题标题】:Discrepancy with fgetc while reading a text file读取文本文件时与 fgetc 的差异
【发布时间】:2013-10-23 12:02:54
【问题描述】:

我从 C 开始,我愿意了解某些条件。

我有一个文本文件,由记事本生成或通过 shell 直接在 windows 操作系统中通过 echo 生成。

运行此命令时,输出会显示额外的字符。我做错了什么?如何以安全的方式逐字符读取文本文件?

将代码块与 minggw 一起使用。

文件.txt:

TEST

C 程序

void main()
{
   int i;
   FILE *fp;

   fp = fopen("file.txt","r");

   while ((i = fgetc(fp)) != EOF)
   {
      printf("%c",i);
   }
}

输出

 ■T E S T

【问题讨论】:

  • 应该是while ((c = fgetc(fp)) != EOF)
  • 这是fp,我忘记翻译了,现在可以了.. ty!

标签: c fgetc


【解决方案1】:

您的代码有问题,但结果很好。

您的文件很可能是 UTF-8,开头带有(令人困惑的)byte order mark。您的程序正在(正确地)读取和打印 BOM 的字节,然后在输出中显示为正确文本之前的奇怪字符。

当然,UTF-8 永远不需要字节顺序标记(它是 8 位字节!),但这并不能阻止一些不太熟悉的程序包含一个字节顺序标记。 Window 的记事本是此类程序列表中的第一个程序。

更新:我没有考虑您的字母之间的间距,这当然表示 16 位输入。那就是你的问题了。您的 C 代码没有读取宽字符。

【讨论】:

  • 嗯,echo 也会使文件看起来像这样。 Notepad++ 写了一个没问题的文件,但是当打开“坏”的文件时,它以同样糟糕的方式保存它。那是因为编码是 UCS-2 Little indian.. 当我切换到 ANSI 时它运行正常,当 UTF8 另一个字符出现在开头时。
  • 对使用 fgect 以更轻松的方式读取此编码文件有任何想法吗?有任何实现或库负责这样做吗?谢谢!
【解决方案2】:

试试这个代码

void main()
{
   int c,i;
   FILE *fp;

   fp = fopen("file.txt","r");

   while ((i = fgetc(fp)) != EOF)
   {
     printf("%c",i);
   }
}'

【讨论】:

  • 这是我发布的更正代码:>输出相同,我认为编码有问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多