Я хочу знать размер файла в С++ без использования нестандартного _64 (f) stat thingy. В соответствии с qaru.site/info/15742/... ответ должен быть
using namespace std;
ifstream::pos_type filesize(const char* filename)
{
ifstream in(filename, ifstream::ate | ifstream::binary);
return in.tellg();
}
Но мой 64-разрядный пример в VS 2013 Update5 показывает странное поведение: если файл меньше 4G, то решение выше работает, иначе оно возвращает -1.
ofstream myfileo("example.bin", ios::binary); // create an example file
auto pos = (4ULL * 1024 * 1024 * 1024); // 4 Gigs
myfileo.seekp(pos);
myfileo << "This is a line.\n";
myfileo.close();
ifstream myfile("example.bin", ios::binary | ios::ate); // get filesize V1
auto len = myfile.tellg();
myfile.close();
cout << "size is: " << len << " bytes.\n"; // only works if file < 4G
Следующий код работает для всех случаев.
ifstream myfile("example.bin", ios::binary); // get filesize V2
myfile.seekg(0, ios::end);
auto len = myfile.tellg();
myfile.close();
cout << "size is: " << len << " bytes.\n"; // works also for files > 4G
Итак, это просто проблема с MS или я что-то пропустил?