-3

fwrite在 MFC 应用程序中使用打印内容,lBuffer如下面的 C++ 代码所示:

PvBuffer *lBuffer = NULL;

// Retrieve next buffer     
PvResult lResult = lStream.RetrieveBuffer(&lBuffer, &lOperationResult, 1000);
if (lResult.IsOK())
{
    FILE *fp = fopen("C:\\Users\\acm45\\Desktop\\abuffer.bin", "wb");
    fwrite(lBuffer, 1, 10075968, fp);
    fclose(fp);
}

IResult知道为什么即使返回成功,文件 abuffer.bin 的内容总是空的吗?
请注意,当我运行程序时,总是会创建该文件,但它是空的,大小为 0KB。

更新:
为了调试我这样做了:

FILE *fp = fopen("C:\\Users\\acm45\\Desktop\\abuffer.bin", "wb");
if (fp) {
    fwrite(lBuffer, 1,10075968, fp);
    fclose(fp);
} else {
    printf("error opening file");
}

并且输出没有打印“错误打开文件”,但文件仍然是空的。现在我该怎么做?

4

3 回答 3

1

我猜你在那里有一些未定义的行为。

fwrite 的手册页说:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

函数 fwrite() 将 nmemb 数据元素(每个 size 字节长)写入 stream 指向的流,从 ptr 给定的位置获取它们。

但你的电话

lStream.RetrieveBuffer( &lBuffer, &lOperationResult, 1000 );

让我猜你没有每一个字节长的 10075968 个元素。

另外:您的缓冲区是 POD 元素的集合吗?如果不是,那是未定义行为的另一个原因。fwrite仅适用于 POD 类型。

通常,最好使用 C++ 流。


解释 fwrite 的附录

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

这里,size表示单个元素的大小。

nmemb是此类元素的数量。例如:

...
struct Foobar {
    int frob;
};

int main () {
    ...
    Foobar thingies[5];
    fwrite (thingies, sizeof(Foobar), 5, some_file);
}

更通用的方法是:

    Foobar thingies[5];
    const size_t nm = sizeof(thingies) / sizeof(Foobar);
    fwrite (thingies, sizeof(Foobar), nm, some_file);

这读为:“数组的大小,除以单个元素的大小,等于该数组中元素的数量”。

但请注意,这只适用于数组,不适用于指针!

    Foobar *thingies = new Foobar[5];
    const size_t nm = sizeof(thingies) / sizeof(Foobar);
    fwrite (thingies, sizeof(Foobar), nm, some_file);
    // THIS IS WRONG. sizeof(thingies) now equals to the
    // size of a pointer!
于 2012-07-03T11:58:07.723 回答
-1

尝试这样做:

FILE *fp = fopen("C:\\Users\\acm45\\Desktop\\abuffer.bin", "wb");
if (fp) {
    fwrite(lBuffer, 1, 10075968, fp);
    fclose(fp);
} else {
    perror("fopen");
}
于 2012-07-03T11:48:42.907 回答
-1

检查您是否正确检索缓冲区。使用该类中可用的函数来获取缓冲区的大小并传递它而不是该常量。

于 2012-07-03T12:14:47.117 回答