【发布时间】:2012-02-18 21:38:27
【问题描述】:
我有一些 C 代码应该打印文件的全部内容。该程序以前打印文件很好,但是当它打印一秒钟时,我一直看到一个绝对不应该存在的 Unicode 字符。
int c = fgetc(file);
putchar((!isprint(c) ? : c));
(包裹在while(!feof(file))中)
除非我弄错了,否则应该只打印 ASCII 可打印字符。无论如何,它打印的第一件事是\357\277\275,它不是 ASCII,也不能打印。
该文件仅包含以下内容:foo+bar.foo+t-bar.foo+completely fake
它会打印出这个:�foo+bar.foo+t-bar.foo+completely fake(在奇怪的字符和其他字符之间有一个换行符)。
只需将其全部打印出来(如putchar(c))将完全相同的字符放在行尾。
我什至尝试过使用另一个文件(通过重命名旧文件并使用指向另一个文件的软链接),但我得到了完全相同的结果。
如果文件为空,它也会这样做。
该文件是完全纯文本,用 vim 创建的,没有什么特别之处。
这是原始代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
int main(void)
{
char *headp = "../include/header";
char *listp = "../.piclist";
FILE *head, *list;
puts("Content-Type: text/html; charset=utf-8\nExpires: 0\n");
puts("<!DOCTYPE html>\n<html lang='en'>\n<head>");
puts("\t<title>Foo</title>");
puts("\t<link rel='stylesheet' href='/css/main.css' />");
puts("\t<link rel='stylesheet' href='/css/foo.css' />");
puts("</head>\n<body>");
head = fopen(headp, "r");
if (errno) {
perror("cannot open include/header");
errno = 0;
} else {
while (!feof(head)) putchar(fgetc(head));
putchar('\n');
fclose(head);
}
list = fopen(listp, "r");
if (errno) perror("cannot open .piclist");
else {
while (!feof(list)) {
while (!feof(list)) {
int c = fgetc(list);
putchar((!isprint(c) ? : c));
}
}
fclose(list);
} /* else */
fputs("\n<footer>\n\t<hr />\n\t<p>Copyright 2011-2012 the ", stdout);
fputs("<a href='mailto:foo@example.com'> ", stdout);
fputs("Foo Bar of Baz</a> of ", stdout);
fputs("<a href='http://blah.org'>Blah United ", stdout);
fputs("</a></p>\n</footer>\n</body>\n</html>\n",stdout);
return 0;
}
【问题讨论】:
-
... 也是当文件为空时,因为你的 feof() 使用是错误的。请贴出真实代码。
-
您能否展示一个完整的、可编译的示例来演示该问题?
-
putchar((!isprint(c) ? : c));
-
@H2C03 这是一个 GNU 扩展 gcc.gnu.org/onlinedocs/gcc/Conditionals.html
-
“奇怪的字符”是U+FFFD,UTF-8编码。
标签: c unicode ascii non-ascii-characters ansi-c