将缓冲区/指针设置为null

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行,基本上是:

/* 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);
}
Run Code Online (Sandbox Code Playgroud)

我做谷歌的方法是将缓冲区指针设置为NULL并尝试了各种建议,但似乎都没有.任何人都可以澄清什么是将其设置为NULL的正确方法?

cni*_*tar 5

你不能说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选项.


Bet*_*eta 5

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)

它每次都会被覆盖.