更多的问题,我真的很困惑,而且我一直困扰着我,我几乎用dirent.h尝试了所有的东西。但这是我想要的一个例子:
#include <iostream>
#include "DataEventResponseMsg.idl"
using namespace std;
int main(){
cout << "This is the size: " << sizeof(DataEventResponseMsg) << endl;
return 0;
}
这样做包括该特定文件并找到它的大小并打印出来。我想这样做,但我需要它来打开一个充满.idl文件的目录,并使用sizeof打印它的文件和大小。
我尝试使用dirent.h并打开目录,并将内容放入ent-&gt; d_name,然后查找d_name的大小等等,但所有这一切都是打印大小的指针..我尝试将文件放入数组,但执行sizeof只打印数组的大小。我希望它打印实际文件的大小,就像我将它们包含在头文件中一样,就像我发布的文件一样..
这有可能吗?我很困惑,我需要让它工作,但我需要帮助。
请帮忙。
编辑------
所以我用dirent.h完成了这个:
#include <iostream>
#include <dirent.h>
#include <string.h>
#include <fstream>
using namespace std;
int main( int argc, char* argv[] ){
char FileArr[20][256];
DIR *dir;
FILE *fp;
int i = 0;
int k;
struct dirent *ent;
dir = opendir (argv[1]);
if( dir != NULL ){
while(( ent = readdir ( dir ) ) != NULL ){
strcpy( FileArr[i], ent->d_name );
fp = fopen( FileArr[i], "rw" );
cout << FileArr[i] << ", " << sizeof(FileArr[i]) << endl;
fclose(fp);
i++;
}
closedir( dir );
}
return 0;
}
这从命令行打开了目录,它将内容放入ent-&gt; d_name,然后我将这些字符串复制到一个数组中,并试图找到数组中所有内容的大小。但是,执行sizeof只会执行指针的数组大小,如果我使用指针的话。我想找到实际文件的sizeof,而不是任何持有文件字符串/名称的文件。
答案 0 :(得分:5)
有几种方法可以在C ++中获取文件的大小。一种方法是寻找文件结尾,然后询问文件指针的位置:
ifstream file("filename.idl", ios::in);
file.seekg(0, ios::end);
auto fileSize = file.tellg();
这甚至以此页面为例:
http://www.cplusplus.com/reference/istream/istream/tellg/
除此之外,还有其他(特定于操作系统)解决方案,如评论中指出的那样,但无论您的平台如何,这种方法都应该有效。
答案 1 :(得分:2)
只要你已经知道目录中的文件是什么,致命吉他提供的答案是一种很好的独立于操作系统的获取文件大小的方法。如果您不知道目录中的文件是什么,那么您将重新使用特定于平台的工具,例如,dirent
for Linux,如您所建议的那样。以下是如何使用dirent
:
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
int main(int argc, char *argv[]) {
struct stat file_stats;
DIR *dirp;
struct dirent* dent;
dirp=opendir("."); // list files in the current directory (replace with any other path if you need to)
do {
dent = readdir(dirp);
if (dent)
{
printf(" file \"%s\"", dent->d_name);
if (!stat(dent->d_name, &file_stats))
{
printf(" is size %u\n", (unsigned int)file_stats.st_size);
}
else
{
printf(" (stat() failed for this file)\n");
}
}
} while (dent);
closedir(dirp);
}