我正在学习如何用C语言编写一个简单的CGI页面。我在Linux和Windows上都试过Apache。我在运行不同操作系统的2台不同计算机上编译了我的脚本。
#include int main() { FILE *fp = fopen("plain_text.txt", "r"); // text-mode only. if (fp) { int ch; printf("content-type: text/plain\n\n"); while ((ch = fgetc(fp)) != EOF) { printf("%c", ch); } fclose(fp); } return 0; }
我将其编译成可执行文件并将其放在cgi-bin
目录中。当我使用我的Web浏览器浏览它时,它会正确返回纯文本内容(Linux和Windows)。
#include int main() { FILE *fp = fopen("cat_original.jpg", "rb"); // with binary-mode. if (fp) { int ch; printf("content-type: image/jpg\n\n"); while (((ch = fgetc(fp)) != EOF) || (!feof(f1))) // can read whole content of any binary file. { printf("%c", ch); } fclose(fp); } return 0; }
我将它编译成可执行文件并将其放在cgi-bin
目录中。
我可以使用Linux编译的可执行文件获得正确的返回图像;但是,Windows没有。
为了解这个问题,我用Windows编译执行文件下载了返回的图像。
(我将此图片命名为:cat_downloaded_windows.jpg
)
然后,我使用VBinDiff比较2个图像:cat_original.jpg
(68,603字节)和cat_downloaded_windows.jpg
(68,871字节)。
cat_downloaded_windows.jpg
中有很多行(就像我标记的行一样)有一个cat_original.jpg
没有的字符。
所以,我猜Windows操作系统会导致问题(Windows会自动添加一些字符,而Linux则不会 (Apache和Web浏览器不会导致问题)
因此,我将此主题发布到StackOverflow中以获取帮助。我有两个问题:
printf("%c", ch);
(在我的脚本中)是否有任何问题?stdout
,Linux和Windows?我正在自学编程,这是我第一次询问StakOverflow。 所以,如果我的问题不明确,请在这个问题下面评论;我会尝试解释一下。
感谢您的时间!
答案 0 :(得分:3)
当您使用printf()
写入标准输出时,它正在以文本模式工作,而不是二进制模式,因此每当您的程序在JPEG文件中遇到换行符\n
时,它都会写入{{在Windows上,1}}会破坏JPEG文件。
您需要知道如何将标准输出置于二进制模式,并且您需要确保在标题中生成\r\n
代替\r\n
。
MSDN文档说您可以使用_setmode()
,并显示示例(设置\n
而不是stdin
):
stdout