使用C ++文件stream(fstream),你如何确定文件的大小?

我确定我刚刚在手册中错过了这个,但是如何从fstream头文件中使用C ++的istream类来确定文件的大小(以字节为单位)?

您可以使用ios::ate标志(和ios::binary标志)打开文件,所以tellg()函数将直接给你文件大小:

 ifstream file( "example.txt", ios::binary | ios::ate); return file.tellg(); 

你可以寻find最后,然后计算差异:

 std::streampos fileSize( const char* filePath ){ std::streampos fsize = 0; std::ifstream file( filePath, std::ios::binary ); fsize = file.tellg(); file.seekg( 0, std::ios::end ); fsize = file.tellg() - fsize; file.close(); return fsize; } 

不要使用tellg来确定文件的确切大小。 由tellg确定的长度将大于可以从文件中读取的字符数。

从stackoverflow问题tellg()函数给错误的大小的文件? tellg不报告文件的大小,也不报告从字节开始的偏移量。 它报告一个令牌值,以后可以用来寻find同一个地方,只是没有更多。 (甚至不能保证你可以把types转换为一个整数types)。 对于Windows(以及大多数非Unix系统),在文本模式下,tellg返回值和您必须读取以获取该位置的字节数之间没有直接和即时映射。

如果确切地知道你可以读取多less字节是很重要的,那么可靠的唯一方法就是阅读。 你应该能够做到这一点,如:

 #include <fstream> #include <limits> ifstream file; file.open(name,std::ios::in|std::ios::binary); file.ignore( std::numeric_limits<std::streamsize>::max() ); std::streamsize length = file.gcount(); file.clear(); // Since ignore will have set eof. file.seekg( 0, std::ios_base::beg ); 

喜欢这个:

 long begin, end; ifstream myfile ("example.txt"); begin = myfile.tellg(); myfile.seekg (0, ios::end); end = myfile.tellg(); myfile.close(); cout << "size: " << (end-begin) << " bytes." << endl; 

我是新手,但是这是我自学成才的方式:

 ifstream input_file("example.txt", ios::in | ios::binary) streambuf* buf_ptr = input_file.rdbuf(); //pointer to the stream buffer input.get(); //extract one char from the stream, to activate the buffer input.unget(); //put the character back to undo the get() size_t file_size = buf_ptr->in_avail(); //a value of 0 will be returned if the stream was not activated, per line 3.