2011-06-16 76 views
0

我有一個用C語言編寫的網站後端,它將HTML頁眉和頁腳模板以及動態生成的內容粘貼在一起。出於某種原因,每次調用displayTemplate()後都會附加一個不需要的'''(umlaut-ed y)'字符(ASCII 152)。這個字符是不需要的,而不是文件的一部分。如何防止輸出?謝謝。刪除不需要的字符FOM CGI輸出

執行此功能的代碼看起來是這樣的:

#include <stdio.h> 
#include <stdlib.h> 

void displayTemplate(char *); 

int main(void) { 
    printf("%s%c%c\n", "Content-Type:text/html;charset=iso-8859-1", 13, 10); 
    displayTemplate("templates/mainheader.html"); 
    /* begin */ 
     printf("<p>Generated site content goes here.</p>"); 
    /* end */ 
    displayTemplate("templates/mainfooter.html"); 
    return 0; 
} 
void displayTemplate(char *path) { 
    char currentChar; 
    FILE *headerFile = fopen(path, "r"); 
    do { 
     currentChar = fgetc(headerFile); 
     putchar(currentChar); 
    } while(currentChar != EOF); 
    fclose(headerFile); 
} 
+1

你不應該檢查EOF _before_你輸出的字符?另外,152不是ASCII,ASCII只能上升到127。最後,你不需要手動打印「\ 13 \ 10」(你可以這樣引用),「\ n」已經考慮到了這一點。 – 2011-06-16 02:05:45

+0

使用'fread'和'fwrite'更好地處理文件。 – lhf 2011-06-16 02:10:21

+0

如果你發現任何有用的答案,你應該「接受」它們來提高你的StackOverflow業力和尊重:-) – 2011-06-16 02:13:50

回答

0

'ÿ'是ISO 8859-1 255。停止嘗試打印EOF。該EOF是二進制表示的所有的人,當減少到8位是255

2

更改您的循環:

while (true) 
{ 
    currentChar = fgetc(headerFile); 
    if (currentChar == EOF) break; 
    putchar(currentChar); 
} 

有比字節讀取字節可能是更好的方式(如讀取整個文件,或者以64kB的塊讀取)。

+0

非常感謝!我無法相信,我沒有看到這一點。 – jjc 2011-06-16 02:13:19

+0

發生在最好的狀態。實際上,我認爲這個名字叫做「Knuth的Loop-and-a-Half」。但嚴重的是,只需一次讀取整個文件並直接寫出標準輸出。 – 2011-06-16 02:14:27

+0

由於我使用的系統使用緩衝I/O,它真的很重要嗎? – jjc 2011-06-16 02:24:30