1. Си / Говнокод #17892

    +131

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    fi = fopen("kokoko.tmp", "rb");
    
            fseek(fi, 0, SEEK_END);
            file_size = ftell(fi);
            fseek(fi, 0, SEEK_SET);

    rewind? system call? Не, не слышали.

    Запостил: codemonkey, 30 Марта 2015

    Комментарии (96) RSS

    • В чём говно? Ну помимо того, что ftell() какого то хуя возвращает long, а он может оказаться коротковатым.
      Ответить
      • >>Ну помимо того, что ftell() какого то хуя возвращает long

        Как узнал?!
        Ответить
        • В мане/стандарте написано же.

          В общем-то очередная сишкоблядская проблема: если файл больше двух гиг, то можно забыть о кроссплатформенных fseek()/ftell(). Придётся хуярить ifdef'ы и платформозависимые костылики.
          Ответить
          • В 1980 никто не думал, что файлы могут быть такими большииииииими
            Ответить
          • > и платформозависимые костылики.

            POSIX?

            man 2 open
            man 2 lseek
            man 2 stat

            уже давно платформ не вижу где off_t все еще 32 бита.

            ЗЫ С стандарт всегда слегка кривым и отстающим был, потому что хотят максимальной портабельности. с одной стороры. с другой, за годы практики, файлы больше 2Г видел крайне редко.

            ЗЗЫ и на 64бит *нихах, лонг он 64бита. все нормальные 64бит платформы LP64.
            Ответить
            • > уже давно платформ не вижу где off_t все еще 32 бита
              Ну вот скомпилил сейчас в бубунте прогу с -m32, получил sizeof(off_t) == 4. -D_FILE_OFFSET_BITS=64 всё-таки ещё нужно передавать.

              > POSIX?
              Винда умеет в позикс без костылей типа цыгвина?

              > все нормальные 64бит платформы
              Ключевое слово - 64бит. На 32-битках лонг коротковат.
              Ответить
              • >Винда умеет в позикс без костылей типа цыгвина?
                Вроде бы да.
                Ответить
                • Из Windows после 2000 (т. е. начиная с XP) позикс уже удалили. Для позикса теперь нужно скачивать и устанавливать отдельную хрень, которая ещё ставится только на Enterprise/Ultimate Edition:
                  https://ru.wikipedia.org/wiki/Подсистема_для_приложений_на_базе_UNIX
                  Или гугли Interix.

                  И экзешники компилировать в специальный формат, и чтобы у пользователей программы эта хрень была установлена...

                  P.S. А для восьмёрки её, кажется, и вовсе нет.
                  Ответить
                  • А, так это тот самый хуевый клон cygwin?

                    Я через этот набор пытался подключить диск через nfs, кое-как с матом сделал, но возникла нерешаемая проблема с кодировкой. Пришлось забить.
                    Ответить
              • > Винда умеет в позикс без костылей типа цыгвина?

                На винде еще кто-то программирует не на Шарпе?

                (Про цигвин... Называть цигвин костылём это оскорбительно для всех остальных в сравнении весьма приличных костылей.)

                > > все нормальные 64бит платформы
                > Ключевое слово - 64бит. На 32-битках лонг коротковат.

                но на 32бит платформах - либо легаси, либо встроенщина - шансов встретить 2ГБ файл очень мало.

                типичный пример это видео файлы. но видео-проигрывание само по себе уже не портабельно.

                да, теоретически есть проблема. практически? - я чаще спотыкаюсь на FAT и его ограничения, нежели чем на то что прога обламывается на большых файлах. и насколько долга прога не пытается опрашивать размер файла, а просто последовательно его читает/пишет, то все работает.
                Ответить
                • Хуясе, это с какого хуя на 32 бита нельзя встретить 2гб?
                  Ответить
                  • где я сказал что "нельзя"?
                    Ответить
                    • >шансов встретить 2ГБ файл очень мало.
                      Хуясе мало. Алсо про насы не слышал?
                      Ответить
                      • при чем тут NAS??
                        Ответить
                        • Там обычно арм 32 бита
                          Ответить
                          • и?
                            Ответить
                            • И файлы больше 2 гб.
                              Ответить
                              • в смысле? 2ГБ файлы и ARM - какое специальное отношение они имеют к друг другу?
                                Ответить
                                • >но на 32бит платформах - либо легаси, либо встроенщина - шансов встретить 2ГБ файл очень мало.
                                  Ответить
                                  • "платформа" в смысле "ОС". разрядность проца не имеет непосредственного влияния на интерфейс оси.
                                    Ответить
                                    • > непосредственного

                                      Ну да, но опосредованно- ещё как влияет. Пока дефайн не передашь - будет юзать 32-битные оффсеты.
                                      Ответить
                                      • > Пока дефайн не передашь

                                        ... и пока в коде не начнешь правильно обращатся с потенциально 64 бит значениями.

                                        по моему опыту, главные грабли в том что sizeof(off_t) != sizeof(long).
                                        Ответить
                                • Видимо, сэм имеет в виду, что на насах стоит 32-битная ось и при этом лежит дофига файлов больше 2 гиг (фильмы, исошки и т.п.)
                                  Ответить
                                  • "Видимо, сэм имеет в виду, что на насах стоит 32-битная ось и при этом лежит дофига файлов больше 2 гиг (фильмы, исошки и т.п.)"

                                    прикладники...

                                    мы на 16бит процах с метром памяти работали. как это вообще возможно было!? магия?
                                    Ответить
                                    • Dummy00001, хватит тупить и убегать от темы.
                                      >но на 32бит платформах - либо легаси, либо встроенщина - шансов встретить 2ГБ файл очень мало.
                                      Ответить
                                      • ну так я сказал этим все что я хотел сказать. ты свой вопрос (если он у тебя есть) не потрудился сформулировать.
                                        Ответить
                                        • Еще раз: ты сказал
                                          >но на 32бит платформах - либо легаси, либо встроенщина - шансов встретить 2ГБ файл очень мало.
                                          Я говорю: пиздежь и провокация, подумай хотя бы о NAS, не говоря от 32 бит осях на десктопе
                                          Ответить
                                          • > подумай хотя бы о NAS,

                                            при чем тут NAS?

                                            > не говоря от 32 бит осях на десктопе

                                            при чем тут битность осей?

                                            какое отношение это имеет к простому факту (который я констатировал) что файлы размером 2GB/более встречаются крайне редко?

                                            редкому софту нужны большие файлы. (даже ДБ по умолчанию бьют тэйблспэйсы на мелкие файлы.) кроме видео я даже и другого примера навскидку припомнить не могу.
                                            Ответить
                                            • сранные логи разрастаются до охулион гб.
                                              Ответить
                                            • >файлы размером 2GB/более встречаются крайне редко
                                              С таким же успехом можно написать, что "потребность в поддержке юникода крайне мала". Ты смотри на то,какой софт гарантированно не столкнется с файлами > 2gb.

                                              И главное, блядь, почему вероятность встретить на 64 бит такие файлы больше?
                                              Ответить
                                              • > И главное, блядь, почему вероятность встретить на 64 бит такие файлы больше?

                                                А я этого и не говорил.

                                                С другой стороны, есть народ который перелазил на 64бита специально для того что бы всякое такое в память пихать можно было без напряга.
                                                Ответить
                                                • В память, блжад, но причем тут диск-то?
                                                  Ответить
                                                  • потому что, то что сидит в памяти часто в лоб сливается на диск, или в лоб читается с диска.
                                                    Ответить
                                                    • И это единственная возможность, как на диске может очутиться файл больше 2 гиг?

                                                      Все, утомил.
                                                      Ответить
                                            • Базы данных (например куки какого-нибудь браузера вполне могут быть и больше).
                                              Данные всяких бугхалтерских приложений, которые могут быть базой данных, а могут быть и просто файлами (но очень большими). Форматы для исследовательского ПО (геном какой-нибудь дрозовилы вполне может быть больше 2 гигов), ГИС (карты).
                                              Ответить
                                              • >Форматы для исследовательского ПО
                                                Охуенно часто встречаются.

                                                Заебали вузовцы/научники считать себя пупом земли
                                                Ответить
                                              • вопрос был о портабельном софте. во-первых.

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

                                                а тут народ устроили какой-то глупый флейм как если бы я тут заявил что завтра конец света.

                                                и самое главное, что в догонку к моему примеру видео, только один человек - один! - сумел привести еще один конкретный пример больших файлов (большие логи) в реальной жизни.
                                                Ответить
                                                • А видеофайлы/изошки/архивы это хуйня? Мы с тобой видно в разных мирах живем.
                                                  Ответить
                                                • Не проще ли один раз выучить, как открывать большие файлы вместо того чтобы думать где они могут встречаться? Кажется, из-за таких тугих мудаков как ты еще можно встретить проги, которые до сих пор не могут в юникод.
                                                  Ответить
                                                  • А вдруг от открытия большого файла случится ОВЕРХЕД?
                                                    Ответить
                                                  • Оффтоп: переписывался с одним из админов института, солярщиком, так его допотопный клиент не переваривал юникод в теме письма. ü с каждым ответом превращался в ü, ü и т д
                                                    Ответить
                                                    • А это может быть связано не с Юникодом, а с тем, что кто-то из разработчиков не отслеживает цепочки экранирования и деэкранирования. В вебе такой питушни достаточно.
                                                      Ответить
                                                      • >переписывался
                                                        Это емейл. На тот момент больше такой хуйни нигде не было.
                                                        Ответить
                                                        • & — это веб. Точнее, сущность HTML. Программа, не знакомая с HTML, не может насовать этих &

                                                          Тут просто мудак-разработчик на всякий пожарный экранировал символы, а деэкранировать забывал. Такое бывает.

                                                          И да, в теме этой питушне не место. По идее она должна появляться только в теле письма, да и то при условии, что тело в формате HTML.

                                                          Вполне возможно, что собеседник писал не через почтовую программу, а через веб-морду почтового сервиса. Были сервисы, которые все символы за пределами ASCII считали потенциально небезопасными.
                                                          Ответить
                                                          • Через ту же вебморду писал и я и все было нормально. Только с ним такое было.
                                                            Ответить
                                                  • > Кажется, из-за таких тугих мудаков как ты

                                                    лол. я юникоды как и большие файлу уж как 15+ лет делаю.

                                                    и вопрос был не конкретно о больших файлах - а об портабельном интерфейсе для больших файлов.

                                                    по вашей детской неспособности соосредоточится на топике, я догадываюсь что ваша голова все еще напичкана наивными идеалами.
                                                    Ответить
                                                    • Я про сишкоговно не читал. Начал читать с момента, где ты сказал что файлы > 2 гб нинужны.
                                                      Ответить
                                                      • > Начал читать с момента, где ты сказал

                                                        ... и читать в добавок не умеешь.
                                                        Ответить
                                                        • >но на 32бит платформах - либо легаси, либо встроенщина - шансов встретить 2ГБ файл очень мало.
                                                          Исходя из этого, их поддержка не нужна?
                                                          Ответить
                                                          • "Исходя из этого, их поддержка не нужна?"

                                                            Исходя из этого, если портабельность имеет приоритет, поддержка больших файлов опциональна.
                                                            Ответить
                                                            • Вот поэтому си - говно. В нормальных языках не приходится выбирать между портабельностью и поддержкой актуальных фич.
                                                              Ответить
                                                              • весьма информативная переписка.

                                                                годы, десятилетия проходят, а прикладники как были так и остаются тупой лимитой.
                                                                Ответить
                                                                • А ты кем будешь?
                                                                  Ответить
                                                                  • системщик. встроенка, операционки (драйвера), сети, юнихи.
                                                                    Ответить
                                                                    • Эксплоит для переполнения буфера написать сможешь?

                                                                      http://govnokod.ru/17892#comment269457
                                                                      Сишники как были, так и остаются байтодрочерами, в отличие от господ высокого уровня, которым не приходится растягивать свою память, чтобы она вмещала костыли под все платформы.
                                                                      Ответить
                                                                      • > Эксплоит для переполнения буфера написать сможешь?

                                                                        теоретически, да. практически, никогда не пробовал. туториалы на сети лежат - сложного там ничего не видел. но тема меня не привлекает.

                                                                        > в отличие от господ высокого уровня, которым не приходится растягивать свою память, чтобы она вмещала костыли под все платформы.

                                                                        я 5+ лет под виндами работал - дельфи, билдер и вижуал. ушел на линухи как раз потому что задрало "растягивать свою память, чтобы она вмещала костыли", и это только *под одну платформу*. потому что граблей совместимости между версиями виндов разложено щедро.
                                                                        Ответить
                                                                        • >я 5+ лет под виндами работал - дельфи, билдер и вижуал.
                                                                          В 90-х? Про языки с гц не слышал?
                                                                          Ответить
                                                                          • гц?

                                                                            3 года жабы.

                                                                            и хез знает сколько лет скриптовых языков (перл, питон, нынче еще руби трогать приходилось).

                                                                            гц, как и его алгоритмы тема нетривиальная - но однозначно не непостижимая.
                                                                            Ответить
                                                                            • GC.

                                                                              Вот и отлично, теперь сравни с жавой изъябства по правильному открытию файлов и расскажи мне теперь про "прикладников"
                                                                              Ответить
                                                                              • лол. в жабе хез сколько лет было просто невозможно работать с большими файлами. потому что жабу не компилили с поддержкой больших файлов.

                                                                                да и как раз в жабе, с открытием файлов случаются проблемы, если файлы забывать закрывать, потому что GC их хез когда только закроет.
                                                                                Ответить
                                                                                • Да,но когда скомпилили - все программы на яве смогут их открывать. Сечешь фишку?

                                                                                  >да и как раз в жабе, с открытием файлов случаются проблемы, если файлы забывать закрывать
                                                                                  А в си не случается? Там и гц нету-то.
                                                                                  Ответить
                                                                                  • > Сечешь фишку?

                                                                                    почти тоже самое в С: если нужна портабельность, подключашь либу для портабельного ОС интерфейса.... и все. на больших проектах, с высокой вероятностью, уже все давно подключено и ничего специально делать не надо.
                                                                                    Ответить
                                                                                    • На жабе никто не несет хуйню "файлы > 2гб не нужны, кококо". Никто не смотрит, нужна она или нет - ее просто добавляют, причем для этого ничего не надо делать
                                                                                      Ответить
                • До сих пор слишком много компьютеров с 32-битной системой и с накопителями, размеченными NTFS, где большие файлы очень легко встретить.

                  Видеопроигрывание непортабельно? Хорошо. Но есть ведь видеоконверторы типа FFMPEG, которые очень даже портабельны; есть программы для вычисления контрольных сумм; есть всякие качалки.
                  Ответить
                  • "Но есть ведь видеоконверторы типа FFMPEG, которые очень даже портабельны; есть программы для вычисления контрольных сумм; есть всякие качалки."

                    и они всегда были "портабельны" на винды потому что там есть кучка мелких #ifdef WIN32. и еще раз, насколько долго ты не опрашиваешь размер файла (просто последовательно читаешь/пишешь) все будет работать.

                    и если вы уже хотите портабельности, то с виндами большие файлы это вообще мелочи. я в прошлом народу помогал портировать либу которая очень активно (по моему совету) пользовалась snprintf(). из всех шести (или больше?) вариантов этой функции на виндах, все кривые и нет ни одного прямого. почему пришлось несколько дней весь проект обкладывать #ifdef WIN32 (потому что на тот момент еще не было прокладки для портабельности а запускаться уже надо было).

                    а вы про большие файлы...
                    Ответить
                    • Да в сишной либе без позикса UTC'шную дату то не собрать из компонентов (причём разобрать на них можно, лол). Какие уж тут большие файлы...
                      Ответить
                    • ... у сишника каждый день был трудный, и его память была разработана настолько, что он помнил все костыли под винду.
                      Ответить
                      • Но это лишь песчинка по сравнению с памятью крестобляди
                        Ответить
                        • А какая память у верстальщиков, добивающихся кроссбраузерности!
                          Ответить
                          • там все просто. Верстают по ие и нормальные браузеры.
                            Ответить
                            • Всё просто в теории. На практике оказывается, что нормальных браузеров не существует.
                              Ответить
                            • Опера в нормальные браузеры не входит (вспомним --!>)
                              Ответить
                              • Нашёл, к чему прицепиться, когда есть более серьёзные проблемы. Тем более, что проблемы с HTML-комментариями были до внедрения парсеров HTML5 и XHTML, когда такие тонкости ещё не были стандартизованы.

                                Кстати, в каком ГК мы это обсуждали?
                                Ответить
                                • Это - разночтение, которое я смог локализовать, несмотря на то, что я нихуя не веб разработчик. Я под это отдельный гк создал.
                                  Ответить
        • ты не поверишь http://en.cppreference.com/w/c/io/ftell
          Ответить
      • rewind для отката, и не использование stat(2).

        Кроссплатформенность не предусматривается.
        Ответить
        • > rewind для отката
          Придирка, имхо. Что rewind(fi), что fseek(fi, 0, SEEK_SET) эквивалентны.

          Про stat(), пожалуй, соглашусь. Раз кроссплатформенность не требуется.

          P.S. Хотя сам я всю жизнь замерял через пару lseek()'ов... stat(), вроде как, дороже обойдётся, если файл всё равно открыли и собираемся читать/писать.
          Ответить
          • Или тут файл открыли только для того, чтобы померить размер? И дальше идёт fclose() и с файлом больше не работают? В таком случае - говно.
            Ответить
            • Не только, там дальше ещё говнище.
              Ответить
              • Можно посмотреть?
                Ответить
                • Например:

                  int fpga_read(char *dev, unsigned int base_addr, unsigned int offset, int len, unsigned char *buf)
                  {
                      unsigned long long pci_raddr;
                      int actual;
                      FILE    *fi;
                  
                      fi = fopen(dev, "r");
                      if (fi == NULL) {
                          printf("Failed to read from FPGA - Error opening device\n");
                          return 1;
                      }
                  
                      pci_raddr = (unsigned long long) 2 << 32 | (base_addr + offset);
                      setvbuf(fi, NULL, _IONBF, 0);       // disable file buffering
                      fseeko(fi, pci_raddr, SEEK_SET);        // go to the address
                      actual = fread(buf, 1, len, fi);        // read the data
                      fclose(fi);
                      if (actual <= 0) {
                          printf("Error  %d reading from device (dev %s, base addr 0x%x, offset 0x%x, len %i)\n", errno, dev, base_addr, offset, len);
                          return 2;
                      }
                      return 0;
                  }


                  Идет цикл open/llseek/read/close для каждого вызова, а там их миллионы.
                  Ответить
                  • Можно отдельным постом!
                    А зачем нужна такая тонкая абстракция над файлами? Если она действительно нужна, почему уж не сделать её правильно:
                    error_code fpga_open(fpga_device **dev, const char* dev_name, uint64_t base_addr);
                    
                    error_code fpga_close(fpga_device *device_to_close);
                    
                    error_code fpga_read(fpga_device *, uint8_t *buf, uint64_t len, uint64_t offset);
                    Ответить
                  • > FPGA
                    Немного оффтоп, но какую ПЛИС'ку юзаете?
                    Ответить
          • stat и трюк с fseek/ftell могут давать разные результаты, если исследуемый объект... не совсем файл.
            Ответить

    Добавить комментарий