【问题标题】:c++ fopen is returning a file * with <bad ptr>'sc++ fopen 正在返回一个带有 <bad ptr> 的文件 *
【发布时间】:2009-06-02 21:00:42
【问题描述】:

我从 libjpeg 示例中复制了这段代码,并将其传递给标准文件;

FILE *soureFile;
if ((soureFile = fopen(sourceFilename, "rb")) == NULL)
{
    fprintf(stderr, "can't open %s\n", sourceFilename);
    exit(1);
}

jpeg_stdio_src(&jpegDecompress, soureFile);
jpeg_read_header(&jpegDecompress, true);

它会导致文件指针不包含任何信息,因此会在最后一行中断访问冲突。 有什么想法吗?

编辑:根据 Tobias 的建议,fopen 确实可以正常打开文件,但 jpeg_read_header 又因访问冲突而失败。

编辑:经过更多挖掘
JPEG support with ijg - getting access violation

【问题讨论】:

  • 您确定其余代码没有错误,并且该文件包含您认为的内容吗?
  • 我还是不清楚。 fopen() 上面的代码是否返回NULL?
  • 如果 sourceFile != NULL,则 fopen 成功。您能否尝试从 sourceFile 中读取以排除 fopen 部分(例如使用 fgetc)。
  • 程序员不应该使用 FILE 结构的各个字段。它包含错误指针这一事实并不一定意味着结构已损坏,而是这些字段在您阅读它时并不打算使用或用作指针。
  • 什么编译器用于 dll 和您的代码?也许使用相同的编译器可以解决您将 FILE 指针传输到 dll 的问题。

标签: c++ libjpeg


【解决方案1】:

使用 strerror 或 perror 获取确切原因:

FILE *soureFile;
if ((soureFile = fopen(sourceFilename, "rb")) == NULL)
{
    perror("fopen failed");
    exit(1);
}

【讨论】:

  • 不知道那些谢谢。但是由于从 fopen 返回的有效指针,这行将永远不会被命中。
  • 所以事实上 fopen() 正在工作,问题出在你的 jpeg 代码上!
  • 我认为Adam的意思是fopen返回的指针是有效的并且指向一个有效的struct但是struct中的数据是无效的。我刚刚遇到了这个问题,因此遇到了这个问题。进一步说明,调试器可以访问返回值中的变量:_ptr_base_tmpfname 都是无效指针。在查看fopen 的文档时我们被告知,如果文件无法打开,NULL 将被返回。这不是这里的情况。
【解决方案2】:

select isn't broken”。

如果fopen 返回了一个有效的文件指针,而jpeg_read_header 不能使用它,那么这两个语句之间的某个人对它做了坏事。

唯一介于两者之间的是 jpg_stdio_src 调用,如果满足所有先决条件,它不会失败。

底线:看看为什么jpg_stdio_src 会失败。我的猜测:它需要使用jpeg_create_decompress 宏来构造。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多