привет, дружыщща. к созданию этого топика меня сподвигнула статья с codeproject.com. (с) codeproject.com хотелось бы подискутировать на эту тему, т.к. непонятно, как же все таки писать код, к чему придерживаться в данном случае, чтобы код был профессиональным? исходя из статьи получается, что если я решил в своей проге всю работу с файлами осуществлять с помощью класса ifstream, то если мне понадобится узнать размер открытого файла, мне придется прибегать к убогим и некрасивым способам по его получению или же подключать работу с FILE * (получается какбы 2 подхода к работе с файлами -- здесь мы используем FILE *, а 30 строчками выше мы работали с ifstream). если же для работы с файлами я использую FILE* и соответствующие более низкоуровневые ф-ции, то все окей. моя цель - не достижение офигенного быстродействия за счет использования низкоуровневых ф-ций по работе с файлами итд, а написание правильного си++ кода, соответствующего стандарту и прочее, чтобы на протяжении всего кода программы я мог придерживаться определенной изначально взятой идеи как касаемо работы с файлами, так и всего остального*. так какой дорогой мне двигаться? спасибо за разъяснения! ps: и еще: хочется использовать возможности Си++, а не виндоус средства, такие как GetFileSizeEx() итд.
мм, видимо все не суются и ждут, пока придет какой-нибуть умный дядька IceStudent и все пояснит) ps: не в обиду конечно, просто не выдержал)))
есть, но как она поможет получить размер файла? нет, я не спорю, что при использовании ifstream можно получить размер файла, и причем неск. способами, но все они какие-то некрасивые (по ссылке в начале темы они хорошо расписаны). т.е. получается, что из-за того, что мне всего лишь нужно в проге иметь возможность получить размер(ы) файла(ов), мне придется забить на средства ifstream, открывать повторно уже открытый 30 строчками кода выше файл как ifstream, но теперь уже через хэндл FILE *, юзать ф-цию fopen_s, затем применять ф-цию _filenength, затем закрывать этот файл через fclose, и, радостно продолжать далее работу с старым открытым файлом как ifstream, теперь уже имея вычисленный его размер, пусть и таким неэкологичным способом. вот этого я и хочу избежать!! т.е. я хочу использовать средства ifstream, т.к. ifstream как нельзя ближе к Си++, чем FILE * (также как в равной степени я использую в Си++ везде и всегда std::string вместо наследия Си char *), но я не пойму, почему в ifstream не предусмотрели средства по получению размера открытого файла и чтобы достичь сабжа, нужно городить такие громоздкие страшные ф-ции как (c) codeproject.com и тому подобное?
twgt, можно. именно это и предлагается как вариант в ф-ции int FileSize(const char* sFileName), что я привел выше. но мне все же хочется получить размер файла в одну строчку) ведь мы можем сделать подобное, имея открытый FILE *, применив одну-единственную ф-цию _filelength. так почему нельзя сделать что-то подобное, работая с файлом через ifstream? почему не предусмотрели возможность сделать что-то типа: Код (Text): #include <fstream> std::ifstream f; //--открыли файл f.open(sFileName, std::ios_base::in); if ( !f.is_open()) { return 0; } long fsize = f.filesize(); почему нет ф-ции filesize() в классе ifstream? т.е. говоря более общо, почему ее нету в basic_ifstream?
Я думаю что во время f.open() размер загружаемого файла где-то проскакивает, можно попробовать проследить это и посмотреть где именно и как он получается. Просто для меня как-то не логично при открытии файла не знать его размер.
varnie ИМХО способ с seek/tell вполне нормален. Просто в посте #10 ИМХО написано немножко лишнего. Когда у тебя уже есть открытый ifstream, достаточно: Код (Text): f.seekg(0, std::ios_base::end); size_t size = f.tellg();
Не согласен. Да, это наиболее простой и корректный с т.з. С/С++ способ, но всё же этот код явно избыточен и крив. И разве в каких-то файловых/операционных системах нельзя получить размер файла? Хотя, если открыт не файл, а что-то другое (пайп, сокет, стример), тогда да. Но тогда и вышеупомянутый способ не очень-то сработает.
IceStudent, в вашем посте была ирония и/или сарказм? в общем, мне пока неясно, какое правильное решение описанной проблемы используя ifstream. пока что остановился на способе который и maxdiver предложил, да и который и я юзаю, но все же думал что может есть что-то более верное..
Поток, по определению, не имеет размера. Для него (и то не всегда) задается только операция Seek(). (Абстрактный поток задается 5-ю операциями: open/close, putc/getc, seek. Иногда возможен ungetc. Остальное - расширения реализации).
gazlan, спасибо за пояснение!! теперь я все понял в этом плане. значит здесь все гладко с точки зрения С/С++, что и хотелось увидеть! ура)