C++ 确定二进制文件的大小

C++ 确定二进制文件的大小,c++,file-io,input,C++,File Io,Input,我试图读取一个二进制文件,我需要确定它的大小,但不管我尝试了什么方法,我得到的大小都是零 例如: fstream cbf(address, ios::binary | ios::in | ios::ate); fstream::pos_type size = cbf.tellg(); // Returns 0. char* chunk = new char[size]; cbf.read(chunk, size); //... 如果我使用以下方法: #in

我试图读取一个二进制文件,我需要确定它的大小,但不管我尝试了什么方法,我得到的大小都是零

例如:

fstream cbf(address, ios::binary | ios::in | ios::ate);
fstream::pos_type size = cbf.tellg();                   // Returns 0.

char* chunk = new char[size];
cbf.read(chunk, size);
//...
如果我使用以下方法:

#include <sys/stat.h>
struct stat st;
stat(address.c_str(),&st);
int size = st.st_size;
如何获取文件的大小

谢谢你的回复。。。我已经确定了问题:
我试图访问的二进制文件是在执行过程中创建的,我只是忘记在尝试读取它之前关闭它…

您的两个示例都没有检查失败,使用你的第一种方法,对我来说非常有效。它正确地标识了/etc/passwd的大小和/etc/motd的不存在

#include <fstream>
#include <iostream>
#include <string>

void printSize(const std::string& address) {
  std::fstream motd(address.c_str(), std::ios::binary|std::ios::in|std::ios::ate);
  if(motd) {
    std::fstream::pos_type size = motd.tellg();
    std::cout << address << " " << size << "\n";
  } else {
    perror(address.c_str());
  }
}

int main () {
    printSize("/etc/motd");
    printSize("/etc/passwd");
}
#包括
#包括
#包括
无效打印大小(常量标准::字符串和地址){
std::fstream motd(address.c_str(),std::ios::binary | std::ios::in | std::ios::ate);
如果(交通部){
std::fstream::pos_type size=motd.tellg();

std::cout尝试用此方法加载文件

注意:在这一行中使用
ifstream
而不是
fstream
ifstream cbf(地址,ios::binary | ios::in);


欢迎使用SO!请记住检查系统调用的返回值。您不会检查
stat
fstream::open
是否成功。在知道它们成功之前,您不应该依赖它们的结果。我在代码中这样做…我检查fail(),good(),is_open()等等…我只是不想用不必要的代码来打扰你…对不起,最好是用完整的代码来打扰我们,而不是用类似的代码。如果你不告诉我们,我们就不知道你的程序会做什么。请将你的原始程序减少到可能的最小程序,并将完整的、最小的程序粘贴到你的问题。请参阅以了解更多详细信息。哇,你编辑了我的整个帖子…没有意识到我的英语这么差!使用
ifstream cbf
打开文件。否则,请查看下面的我的答案。@Ash,当你运行我的程序时,没有任何更改,你会得到什么输出?@Ash-你传递了一个绝对路径吗?你是否在一个IDE中运行,而cwd可能不是你认为是吗?你能发布
ls-al[filename]
的输出吗,其中
[filename]
就是你传递给
printSize()的确切字符串
?@Michael Burr:这就是我得到的-rw-rw-r--1 ash ash 11月30日16:44_string@Rob:无更改:113 1768,对于我自己的文件6,这正是我文件的大小,所以谢谢,我想问题在于我所做的更改。^^@Ash:运行程序时,您确定cwd吗?是否有其他
压缩sed_string
文件,该文件的大小为零,而程序实际上正在处理该文件?您是否可以进一步说明为什么您认为使用ifstream而不是fstream会有所不同?谢谢,但它就像所有其他建议一样,当它被隔离时工作得非常好,一旦我在类函数中使用它,它将开始返回0而不是真实值文件大小…@Robᵩ :) 我不认识那个人,我不是一个专家。这就是我被教导的方式,这项工作做得很好。有时这项工作会很有效。
#include <fstream>
#include <iostream>
#include <string>

void printSize(const std::string& address) {
  std::fstream motd(address.c_str(), std::ios::binary|std::ios::in|std::ios::ate);
  if(motd) {
    std::fstream::pos_type size = motd.tellg();
    std::cout << address << " " << size << "\n";
  } else {
    perror(address.c_str());
  }
}

int main () {
    printSize("/etc/motd");
    printSize("/etc/passwd");
}
long size;
ifstream cbf(address, ios::binary | ios::in);
cbf.seekg(0, ios::end);
size=cbf.tellg();
cbf.seekg(0, ios::beg);

char* chunk = new char[size];
cbf.read(chunk, size);