c++ 使用堆内存阅读文件

yrdbyhpb  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(192)

为了从一个文件中读取数据,我创建了堆内存,然后将变量指针传递给一个函数,这样fread()就会将文件数据放入指针中。但是当函数返回时,新创建的内存中没有数据。

int main(...) {
  MyFile File;
  File.Open(...);
  int filesize = File.Tell();
  char* buffer = new buffer[filesize]; // Create some memory for the data 
  File.Read((char**)&buffer);

  // Now do something with the buffer. BUT there is trash in it.

  File.Close();
  delete [] buffer;
}

size_t File::Read(void* buf) {
  ...

  ::fseek(fStream, 0, SEEK_END);
  int fileSize = ::ftell(fStream);  // Get file size.
  ::fseek(fStream, 0, SEEK_SET);

  ::fread(buf, 1, fileSize, fStream);

  return (fileSize);
}

是的,我可以将char * myBuffer = new char[fileSize];放在::fread(myBuffer, 1, fileSize, fStream);之前的File::Read(...)中,但我不应该这样做,因为我已经在main()中有堆内存(buffer)。

kokeuurv

kokeuurv1#

你将文件内容读入指针buffer,而不是它指向的数组。
不管怎么说,你把事情弄得太复杂了。你不需要一个指向指针的指针,或者一个void*。你可以简单地把一个char*传递给Read。你真的应该把所指向的缓冲区的大小也传递给Read。否则你就有溢出缓冲区的危险。

int main() {
    MyFile File;
    File.Open(/*.....*/);
    int filesize = File.Tell()
    char* buffer = new buffer[filesize]; // Create some memory for the data 
    File.Read(buffer, filesize);

    // Now do something with the buffer. BUT there is trash in it.

    File.Close();
    delete [] buffer;
}

size_t File::Read(char* buf, size_t count) {
    // ......

    // No need to find the size of the file a second time

    // Return the actual number of bytes read
    return ::fread(buf, 1, count, fStream);
}

相关问题