我试图不断地从不同的文件中将数据读入unsigned char *类型的缓冲区。但是,在读取下一个文件之前,我似乎无法将缓冲区设置为NULL。
这里只是相关代码:
#include <stdio.h>
#include <fstream>
int
main (int argc, char** argv) {
FILE* dataFile = fopen("C:\\File1.txt", "rb");
unsigned char *buffer = NULL;
buffer = (unsigned char*)malloc(1000);
fread(buffer,1,1000,dataFile);
fclose(dataFile);
dataFile = fopen("C:\\File2.txt", "rb");
buffer = NULL;
fread(buffer,1,1000,dataFile);
fclose(dataFile);
system("pause");
return 0;
}
我遇到的错误是第二次出现这一行: fread(buffer,1,1000,dataFile);
我得到的错误是:
调试断言失败! 表达式:(缓冲区!= NULL)
它指向了fread.c的第147行,基本上是:
/* validation */ _VALIDATE_RETURN((buffer != NULL), EINVAL, 0); if (stream == NULL || num > (SIZE_MAX / elementSize)) { if (bufferSize != SIZE_MAX) { memset(buffer, _BUFFER_FILL_PATTERN, bufferSize); } _VALIDATE_RETURN((stream != NULL), EINVAL, 0); _VALIDATE_RETURN(num <= (SIZE_MAX / elementSize), EINVAL, 0); }
我为Google提供了将缓冲区指针设置为NULL的方法,并尝试了各种建议,但似乎都没有。任何人都可以澄清将它设置为NULL的正确方法是什么?
答案 0 :(得分:5)
你不能说buffer = NULL
,因为fread
会尝试取消引用它。解除引用NULL
是C ++中肯定完全违法的事情之一。实际上,你失去了从malloc
得到的东西。也许你正在寻找memset
并试图将缓冲区归零:
memset(buffer, 0, 1000);
但是,在调用fread
之前,您无需执行此操作。没有理由,因为fread
无论如何都会写缓冲区:它不关心它是否归零。
作为旁注:您正在编写非常C-ish代码,我怀疑是C ++(给定fstream
标题)。 C ++有更适合的I / O选项。
答案 1 :(得分:5)
您的buffer
是指针。
执行此操作时:
buffer = (unsigned char*)malloc(1000);
在内存中分配一些空间,并将其起始位置指定给buffer
。请记住,buffer
保存空间开头的地址,这就是全部。当你这样做时:
buffer = NULL;
你扔掉了那个地址。
修改
C ++风格,没有动态内存:
#include <fstream>
using std:: string;
using std:: ifstream;
void readFromFile(string fname)
{
char buffer[1000];
ifstream fin(fname.c_str());
fin.read(buffer, sizeof(buffer));
// maybe do things with the data
}
int main ()
{
readFromFile("File1.txt");
readFromFile("File2.txt");
return 0;
}
无需删除缓冲区的内容。如果每次调用分配和释放缓冲区的成本太高,只需添加static
:
static char buffer[1000];
每次都会被覆盖。