파일의 전체 내용을 인쇄해야하는 C 코드가 있습니다. 이 프로그램은 이전에 파일을 잘 인쇄하지만, 초를 인쇄 할 때 확실히 존재해서는 안되는 유니 코드 문자를 계속 볼 수 있습니다. (A while(!feof(file))
에 싸여) ANSI C : isprint()는 비 ASCII 문자에 대해 true를 반환합니까?
int c = fgetc(file);
putchar((!isprint(c) ? : c));
해야하는에만 인쇄 ASCII 인쇄 가능한 문자는, 내가 틀리지 않는. 그럼에도 불구하고 인쇄 된 첫 번째 것은 ASCII가 아니며 인쇄 할 수없는
\357\277\275
입니다.
foo+bar.foo+t-bar.foo+completely fake
그리고이 인쇄 :
은 파일에만이 포함 �foo+bar.foo+t-bar.foo+completely fake
을 (이상한 문자와 나머지 사이에 줄 바꿈 포함).
단순히 모두 인쇄하면 (aaa putchar(c)
) 줄 끝 부분에 똑같은 문자가 표시됩니다.
나는 다른 파일 (예전의 이름을 바꾸고 다른 파일로 소프트 링크를 사용)을 사용해 보았습니다.하지만 똑같은 결과가 나옵니다.
파일이 비어있는 경우에도이 작업을 수행합니다.
파일은 vim으로 만든 완전히 평범한 텍스트이며 특별한 것은 없습니다. ? 당신의 2 운영자 떠날 때
#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;
}
errno를 만도 ... 가능한 값을 포함 * 파일이 비어있을 때 * 때문에 당신의 무엇이 일어 났는지를 결정하기 위해 feof () 사용이 잘못되었습니다. 실제 코드를 게시하십시오. – wildplasser
문제를 나타내는 완전한 컴파일 가능한 예제를 보여줄 수 있습니까? – NPE
putchar ((! isprint (c)? : c)); <- 어떻게 컴파일합니까? –