我在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");
}
并且输出没有打印“错误打开文件”,但文件仍为空。现在我该怎么做?
答案 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)
检查您是否正确检索缓冲区。使用该类中的函数(如果可用)来获取缓冲区的大小并传递它而不是该常量。