【问题标题】:fopen / ofstream::open fail when creating a BMP filefopen / ofstream::open 创建 BMP 文件时失败
【发布时间】:2019-05-17 04:25:59
【问题描述】:

几年前,我使用 FILE 创建了一个 C++ 函数来创建位图文件。最近(不确定何时或为什么)此代码现在在打开文件时失败。问题在于公开通话...

file_ptr = fopen("ScreenShots/Screenshot1.bmp", "wb");

目前这会导致错误 13,权限被拒绝错误。将文件扩展名更改为其他内容,fopen 工作正常。例如,

file_ptr = fopen("ScreenShots/Screenshot1.bm2", "wb");

文件正确保存,当将扩展名更改回 BMP 时,我可以在 Paintshop 中正确显示文件。

使用 ofstream 快速检查并遇到同样的问题。

任何想法为什么我在尝试打开 BMP 文件以写入数据时收到权限被拒绝错误?有关信息,我在 Windows 10 上使用 Visual Studio Community 2017。

给出完整的代码部分...

BITMAPFILEHEADER bitmap_header;
BITMAPINFOHEADER bitmap_info;
FILE *file_ptr;
unsigned int count;
unsigned char tempRGB;
char filename[256];
bool finished;


// CREATE A UNIQUE FILENAME

count = 1;
finished = false;

do
{
    // CREATE NAME

    sprintf(filename, "ScreenShots/Screenshot%d.bmp", count);


    // CHECK IF FILE EXISTS

    errno = 0;
    file_ptr = fopen(filename, "rb");
    if (file_ptr)
    {
        // FILE EXISTS

        fclose(file_ptr);
        count = count + 1;
    }
    else
    {
        // UNIQUE FILENAME

        file_ptr = fopen(filename, "wb");
        if (file_ptr == NULL)
        {
            // UNABLE TO OPEN FOR WRITING - GIVE UP
            // (USING OWN LOGGING CLASS)

            jalog.log("\nERROR on Screenshot >");
            jalog.log(filename);
            jalog.log("< >");
            jalog.log((short)errno);

            return;
        }

        finished = true;
    }
}
while (finished == false);

【问题讨论】:

  • 您真的确定关于开放模式标志吗?你知道"r" 是为了阅读
  • 以读取模式打开通常不会创建任何文件。
  • @JonAlma 好吧,你可以edit你的问题,如果你在上面,我建议你根据需要在这里发布minimal reproducible example..
  • 可能是文件已经存在,权限不允许写入,所以fopen失败。
  • 您正在查看相对路径"ScreenShots/Screenshot%d.bmp",请确保该路径中有"ScreenShots" 目录。或使用完整路径名。

标签: c++ visual-studio fopen bmp


【解决方案1】:

我设法找到了问题... Avast 防病毒软件。我注意到尝试对 BMP 文件执行打开操作需要几秒钟,而打开任何其他文件类型(成功或不成功)是瞬时的。由于在运行新程序时会发生类似的情况,我尝试禁用所有 Avast 屏蔽,并且可以使用现有代码成功创建 BMP 文件。

为了我自己的个人用途,我可以将我自己的程序列入白名单,但如果我将程序分发给其他人,这很烦人。

感谢您的帮助...很抱歉提出一个最终与 C++ 无关的 C++ 问题!

【讨论】:

  • 在同一个问题上浪费了一个小时后,我知道那是什么感觉。也就是说,您可以将根文件夹(例如“示例”)列入白名单,并且那里的所有程序都可以访问,即使它们位于子文件夹中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多