无法使用fwrite()编写

时间:2012-07-03 11:44:21

标签: c++ mfc fwrite

我在MFC应用程序中使用fwrite来打印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);
}

知道为什么文件abuffer.bin的内容总是空的,即使IResult返回成功吗?
 请注意,在运行程序时始终会创建该文件,但该文件为空,大小为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");
}

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

3 个答案:

答案 0 :(得分:1)

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

fwrite的手册页说:

  

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

     

函数fwrite()将每个大小字节长的数据的nmemb元素写入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!

答案 1 :(得分:-1)

尝试这样做:

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

答案 2 :(得分:-1)

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