在Windows上使用C进行二进制写入模式时出错?

时间:2018-02-07 05:42:23

标签: c windows apache

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

  1. 首先,我创建了一个简单的CGI页面,用于获取静态纯文本内容:
  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)。

    1. 然后,我修改了上面的脚本以获取简单的JPEG内容。 (据我所知:每张JPEG图片都是二进制文件)
    2.    #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和Web浏览器不会导致问题)

      因此,我将此主题发布到StackOverflow中以获取帮助。我有两个问题:

      1. Windows上的printf("%c", ch);(在我的脚本中)是否有任何问题?
      2. 有没有办法将二进制内容打印到stdout,Linux和Windows?
      3. 我正在自学编程,这是我第一次询问StakOverflow。 所以,如果我的问题不明确,请在这个问题下面评论;我会尝试解释一下。

        感谢您的时间!

1 个答案:

答案 0 :(得分:3)

当您使用printf()写入标准输出时,它正在以文本模式工作,而不是二进制模式,因此每当您的程序在JPEG文件中遇到换行符\n时,它都会写入{{在Windows上,1}}会破坏JPEG文件。

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

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

stdout