У меня есть код C, который должен распечатать все содержимое файла. Программа ранее печатает файл просто отлично, но когда он печатает секунду, я все еще вижу символ Unicode, где определенно не должно быть.ANSI C: isprint() возвращает true для символа, отличного от ASCII?
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
(с новой строкой между странным характером и остальными).
Просто печать всего (a la 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:[email protected]'> ", 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 () использование неверно. Отправьте реальный код. – wildplasser
Не могли бы вы показать полный, компилируемый пример, демонстрирующий проблему? – NPE
putchar ((! Isprint (c)?: C)); <- как он компилируется? –