gpt4 book ai didi

c - 在 Windows 上,C 的二进制写入模式出错?

转载 作者:太空宇宙 更新时间:2023-11-04 06:52:54 25 4
gpt4 key购买 nike

我正在学习如何用 C 语言编写一个简单的 CGI 页面。我在 Linux 和 Windows 上都尝试过使用 Apache。我在运行不同操作系统的 2 台不同计算机上编译我的脚本。


  1. 首先,我创建了一个简单的 CGI 页面来获取静态纯文本内容:
    #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目录下。当我使用网络浏览器浏览它时,它会正确返回纯文本内容(Linux 和 Windows)。


  1. 然后,我修改了上面的脚本以获得一个简单的 JPEG 内容。(我的理解是:每一张JPEG图片都是一个二进制文件)
   #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 没有的字符。

VBinDiff

所以,我猜是 Windows 操作系统导致了问题(Windows 会自动添加一些字符,而 Linux 不会)(Apache 和网络浏览器不会造成问题)


因此,我将此主题发布到 StackOverflow 以寻求您的帮助。我有两个问题:

  1. printf("%c", ch);(在我的脚本中)在 Windows 上有什么问题吗?
  2. 有什么方法可以将二进制内容打印到 stdout 中,无论是 Linux 还是 Windows?

我是自己学编程的,第一次在StakOverflow上提问。所以,如果我的问题不清楚,请在这个问题下方发表评论;我将尝试对其进行更多解释。

感谢您的宝贵时间!

最佳答案

当您使用 printf() 写入标准输出时,它是在文本模式下工作,而不是二进制模式,所以每次您的程序遇到换行符时 \n在 JPEG 文件中,它在 Windows 上写入 \r\n,这会损坏 JPEG 文件。

您需要知道如何将标准输出置于二进制模式,并且您需要确保生成 \r\n 代替 \n在标题中。

MSDN 文档说您可以使用 _setmode() , 并显示了一个示例(设置 stdin 而不是 stdout):

#include <stdio.h>
#include <fcntl.h>
#include <io.h>

int main(void)
{
int result;

// Set "stdin" to have binary mode:
result = _setmode(_fileno(stdin), _O_BINARY);
if (result == -1)
perror("Cannot set mode");
else
printf("'stdin' successfully changed to binary mode\n");
}

关于c - 在 Windows 上,C 的二进制写入模式出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48656727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com