c0d*_*3rz 1 c++ buffer pointers fread
我试图不断从不同的文件中读取数据到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;
}
Run Code Online (Sandbox Code Playgroud)
我遇到的错误是在第二次出现这行:fread(buffer,1,1000,dataFile);
我得到的错误是:
调试断言失败!表达式:(缓冲区!= NULL)
它指向fread.c的第147行,基本上是:
Run Code Online (Sandbox Code Playgroud)/* 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); }
我做谷歌的方法是将缓冲区指针设置为NULL并尝试了各种建议,但似乎都没有.任何人都可以澄清什么是将其设置为NULL的正确方法?
你不能说buffer = NULL因为我会fread尝试取消引用它.解除引用NULL是C++中肯定完全违法的事情之一.实际上你正在失去你从中获得的东西malloc.也许您正在寻找memset并尝试将缓冲区归零:
memset(buffer, 0, 1000);
Run Code Online (Sandbox Code Playgroud)
但是,在调用之前,您不需要这样做fread.没有理由因为fread无论如何都要编写缓冲区:它不关心它是否归零.
作为旁注:您正在编写非常C-ish代码,我怀疑是C++(给定您的fstream标题).C++有更适合的I/O选项.
你buffer是一个指针.
当你这样做:
buffer = (unsigned char*)malloc(1000);
Run Code Online (Sandbox Code Playgroud)
你在内存中分配一些空间,并将其起始位置分配给buffer.记住,buffer保留空间开头的地址,就是这样.当你这样做:
buffer = NULL;
Run Code Online (Sandbox Code Playgroud)
你扔掉了那个地址.
编辑:
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;
}
Run Code Online (Sandbox Code Playgroud)
无需删除缓冲区的内容.如果每次调用分配和释放缓冲区的成本太高,只需添加static:
static char buffer[1000];
Run Code Online (Sandbox Code Playgroud)
它每次都会被覆盖.