С++: неоднозначный взгляд на FileSize()

Тема в разделе "LANGS.C", создана пользователем varnie, 2 сен 2007.

  1. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    привет, дружыщща.

    к созданию этого топика меня сподвигнула статья с codeproject.com.
    (с) codeproject.com

    хотелось бы подискутировать на эту тему, т.к. непонятно, как же все таки писать код, к чему придерживаться в данном случае, чтобы код был профессиональным? исходя из статьи получается, что если я решил в своей проге всю работу с файлами осуществлять с помощью класса ifstream, то если мне понадобится узнать размер открытого файла, мне придется прибегать к убогим и некрасивым способам по его получению или же подключать работу с FILE * (получается какбы 2 подхода к работе с файлами -- здесь мы используем FILE *, а 30 строчками выше мы работали с ifstream). если же для работы с файлами я использую FILE* и соответствующие более низкоуровневые ф-ции, то все окей.

    моя цель - не достижение офигенного быстродействия за счет использования низкоуровневых ф-ций по работе с файлами итд, а написание правильного си++ кода, соответствующего стандарту и прочее, чтобы на протяжении всего кода программы я мог придерживаться определенной изначально взятой идеи как касаемо работы с файлами, так и всего остального*. так какой дорогой мне двигаться?

    спасибо за разъяснения!

    ps: и еще: хочется использовать возможности Си++, а не виндоус средства, такие как GetFileSizeEx() итд.
     
  2. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    мм, видимо все не суются и ждут, пока придет какой-нибуть умный дядька IceStudent и все пояснит:))

    ps: не в обиду конечно, просто не выдержал)))
     
  3. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    С 31 числа тут затишье, все отмечают день знаний :)
     
  4. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    А по сабжу, разве в си нет EOF()?
     
  5. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    есть, но как она поможет получить размер файла?

    нет, я не спорю, что при использовании ifstream можно получить размер файла, и причем неск. способами, но все они какие-то некрасивые (по ссылке в начале темы они хорошо расписаны). т.е. получается, что из-за того, что мне всего лишь нужно в проге иметь возможность получить размер(ы) файла(ов), мне придется забить на средства ifstream, открывать повторно уже открытый 30 строчками кода выше файл как ifstream, но теперь уже через хэндл FILE *, юзать ф-цию fopen_s, затем применять ф-цию _filenength, затем закрывать этот файл через fclose, и, радостно продолжать далее работу с старым открытым файлом как ifstream, теперь уже имея вычисленный его размер, пусть и таким неэкологичным способом.

    вот этого я и хочу избежать!! т.е. я хочу использовать средства ifstream, т.к. ifstream как нельзя ближе к Си++, чем FILE * (также как в равной степени я использую в Си++ везде и всегда std::string вместо наследия Си char *), но я не пойму, почему в ifstream не предусмотрели средства по получению размера открытого файла и чтобы достичь сабжа, нужно городить такие громоздкие страшные ф-ции как
    (c) codeproject.com

    и тому подобное?
     
  6. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    я в си не силен, но скажем нельзя взять адрес конца загруженного файла и отнять адрес начала?
     
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    twgt,
    можно. именно это и предлагается как вариант в ф-ции int FileSize(const char* sFileName), что я привел выше. но мне все же хочется получить размер файла в одну строчку:))
    ведь мы можем сделать подобное, имея открытый FILE *, применив одну-единственную ф-цию _filelength. так почему нельзя сделать что-то подобное, работая с файлом через ifstream?

    почему не предусмотрели возможность сделать что-то типа:

    Код (Text):
    1. #include <fstream>
    2.  
    3. std::ifstream f;
    4. //--открыли файл
    5. f.open(sFileName, std::ios_base::in);
    6. if ( !f.is_open()) { return 0; }
    7. long fsize = f.filesize();
    почему нет ф-ции filesize() в классе ifstream? т.е. говоря более общо, почему ее нету в basic_ifstream?
     
  8. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Я думаю что во время f.open() размер загружаемого файла где-то проскакивает, можно попробовать проследить это и посмотреть где именно и как он получается. Просто для меня как-то не логично при открытии файла не знать его размер.
     
  9. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    varnie
    ИМХО способ с seek/tell вполне нормален. Просто в посте #10 ИМХО написано немножко лишнего. Когда у тебя уже есть открытый ifstream, достаточно:
    Код (Text):
    1.   f.seekg(0, std::ios_base::end);
    2.   size_t size = f.tellg();
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Не согласен. Да, это наиболее простой и корректный с т.з. С/С++ способ, но всё же этот код явно избыточен и крив.

    И разве в каких-то файловых/операционных системах нельзя получить размер файла? Хотя, если открыт не файл, а что-то другое (пайп, сокет, стример), тогда да. Но тогда и вышеупомянутый способ не очень-то сработает.
     
  11. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    IceStudent,
    в вашем посте была ирония и/или сарказм?

    в общем, мне пока неясно, какое правильное решение описанной проблемы используя ifstream. пока что остановился на способе который и maxdiver предложил, да и который и я юзаю, но все же думал что может есть что-то более верное..
     
  12. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Поток, по определению, не имеет размера. Для него (и то не всегда) задается только операция Seek(). (Абстрактный поток задается 5-ю операциями: open/close, putc/getc, seek. Иногда возможен ungetc. Остальное - расширения реализации).
     
  13. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    gazlan,
    спасибо за пояснение!! теперь я все понял в этом плане. значит здесь все гладко с точки зрения С/С++, что и хотелось увидеть! ура)
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    gazlan
    Да, век живи — век учись.