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

    +130

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    char unsigned c;
    DWORD m;
    DWORD n;
    int i = 0;
    BOOL b = TRUE;
    
    HANDLE hFile = CreateFile(szFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    if (hFile == INVALID_HANDLE_VALUE) 
    { 
    	printf("Could not open File");
    	return NULL;
    } 
    // узнаем размер файла
    while (b)
    {
    	b = ReadFile(hFile, &c, 1, &m, NULL);
    	if (m == 0)
    	{
    		printf("STOP ");
    		printf("%i\n", i);
    		break;
    	}
    	i++;
    }

    собственно узнаем размер файла, что тут еще скажешь)

    Запостил: dIsoVi, 11 Января 2011

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

    • заодно сканируем диск на ошибки чтения
      Ответить
      • Ага, по одному байту на каждый вызов ReadFile
        Ответить
        • Каждому отдельному байту уважение и почет :)
          Ответить
    • УГ, нуб не знает GetFileSize
      Ответить
      • это то и забавно, учитывая что человек, который это писал, в этом году защищает диплом, по специальности Защита Информаци:)
        Ответить
        • Ну это не удивительно, я много таких кадров знаю. Которые уже закончив ВУЗ еле выдавливают из себя говнокод, при этом многие находят не плохую работу по другим специальностям, к примеру знаю одного, который стал 3D-моделистом.
          Ответить
      • >нуб не знает GetFileSize
        А почему, не GetFileSizeEx? Файл может быть больше 4х гб.

        Часто вообще через не переносимое между системами API нежелательно реализовывать. GetFileSize - не переносимая апишка. Так, что говнокод 5220 получает дополнительные баллы в пользу говнокодности.
        Ответить
        • ой да ладно вам, вот про API здесь как раз все норм, есть разные задачи, в данном случае парсится файл настроек виндового антивируса, так что переносимость тут не особо нужна)
          Ответить
          • >виндового антивируса
            Может однажды он станет не виндовым. Аваст вон работает, как под виндой, так и под линуксом. Nod32 тоже. Зачем закладывать грабли на будующее, если можно сделать нормально без трудозатрат (написав то же кол-во кода, а то и меньше).

            И вообще функции чтения файла - крайне неудобный метод чтения настроек. Можно использовать специально предназанченые для этого библиотеки. Зачем писать свой велосипед?
            Ответить
            • возможно потому что если через лет дцать его портируют, то настройки будут храниться в другом формате и программа уже потеряет актуальность?) подскажите пожалуйста библиотеку для чтения настроек, хранящихся в бинарнике, я буду рад)
              Ответить
              • Пока не узнаешь, что в бинарнике на каком месте читать смысла нет. И причем тут вообще библиотека?
                Ответить
                • кэп?) вот мне тоже было интересно, что за чудо библиотеку имел в виду предыдущий господин)
                  Ответить
                  • Только вот о бинарной природе файла настроек сказано не было изначально. А для текстовых - полно готовых вариантов.
                    Ответить
                    • Вы много знаете антивирусов, хранящих свои настройки в текстовом виде?)
                      Ответить
                      • Я не собирал статистику такого рода. Тем не менее, что мешает хранить настройки в текстовом файле? Что это за настройки, что за антивирус? Вообще ссылаться на реализацию того или иного подхода в серьезных продуктах при рассмотрении кода из дипломом работы не совсем корректно. Особенно учитывая стиль данного кода.
                        Ответить
                        • в современных антивирусах присутствуют различного рода правила, которые задаются пользователем, и которых может быть N-е количество, из-за чего во всех антивирусных продуктах (я пока не встречал исключений), как минимум, частично используется бинарный формат хранения настроек, и до этого можно вполне дойти если подумать, даже не вдаваясь в конкретные продукты) Да и если рассуждать по вашей логике, то считать что настройки хранятся в текстовом формате это тоже ссылаться на реализацию того или иного подхода)
                          Ответить
            • > Может однажды он станет не виндовым
              Не смешите

              > И вообще функции чтения файла - крайне неудобный метод чтения настроек. Можно использовать специально предназанченые для этого библиотеки. Зачем писать свой велосипед?

              Да этому студенту наверняка надо было продемонстрировать свое знание WinApi.
              К тому же бывают ситуации когда готовые решения не подходят.
              Ответить
              • нет знания WinApi там не требовалось) это дипломная работа, пишешь как хочешь)
                Ответить
                • А вот это уже странно. Может он ничего другого тогда не знает?
                  Ответить
                  • я не знаю, чем он руководствовался в данном случае)) в его коде совместно используются функции fopen, fread итд, совместно с CreateFile, ReadFile)) я уж молчу что там используется new и malloc...
                    Ответить
                    • :) Возможно думает, что так "круче". А скорее всего, что это не совсем его курсовая ,а он накопировал кусков чужого кода (это и объясняет fopen, CreateFile, new), а местами решил своего попытаться вставить - вот так и получился говнокод.
                      Ответить
                    • Накопипастил с миру по нитке. Из разных форумов, сборников рецептов и т.п.
                      Ответить
        • > А почему, не GetFileSizeEx? Файл может быть больше 4х гб.
          O__o а с каких это пор нельзя? Прежде чем постить в справочник хоть что ли заглянули.
          Ответить
          • Согласен. Подзабыл. Можно более 4 Гб.
            Ответить
        • > Часто вообще через не переносимое между системами API нежелательно реализовывать. GetFileSize - не переносимая апишка. Так, что говнокод 5220 получает дополнительные баллы в пользу говнокодности.
          Не улавливаю связь переносимость - говнокод. А может автору и не нужна переносимость, в таком случае применение специфического api даже лучше. На WinApi написано огромное количество программ, их авторам по большей части переносимость вообще и не нужна. При этом как правило, на WinApi пишут более опытные программисты и их код далеко != говнокоду. В данном случае студенту просто по теме необходимо было на WinApi реализовывать, наверняка если бы была возможность писал бы на си билдере. Хотя в целом я поддерживаю переносимость, только не считаю, что непереносимо == говногод.
          Ответить
          • >как правило, на WinApi пишут более опытные программисты и их код далеко != говнокоду
            Ну конечно... Я всё что-можно писал на винапи в детстве (писал и даже оконные интерфейсы, а оконные библиотеки неуважал), принебрегая стандартной библиотекой языка. Вообщем во всю писал свои велосипеды.

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

                Этож сколько я времени в пустоту потратил...
                Лучше бы над задачей моделирования и её алгоритмами более серьёзно подумал.

                Я ж всерьёз думал, что всё, что написал сам - это круто, а всё, что написали другие - говно. Начал даже ось свою писать. (Вот долбанутым был...)
                Ответить
                • Да ну почему вы так, ведь не все сразу:) Вам было интересно, при этом вы развивали знание языка программирования, первично знакомились с алгоритмами. Тут главное, чтобы был интерес, а от него какое-никакое развитие. А осознание приходит со временем и не на пустом месте. Вот противоположный пример - автор этого кода, вы бы так наверное уже и на первом курсе бы не написали. Самое плохое когда человеку не интересно заниматься делом и результат за крайне редким исключением соответствующий. Ведь и я таким был, да думаю многие...
                  Ответить
                  • >вы бы так наверное уже и на первом курсе бы не написали
                    Что вы... Чесание пятки левым ухом никогда не практиковал, если есть рука.
                    (Конечно, если ни каких средств, кроме уха не было, то если сильно нужно было, то и ушами чесал).
                    К сожалению, если была специальная автоматическая стелька-чесалка, то ей пользоваться категорически отказывался, ссылаясь на то, что это создано не моими силами.
                    Ответить
                • Плюсую. Я вот нуб, например, всё чисто на WinAPI (в дельфи-7) леплю.
                  Вообще есть три стадии постижения чего-угодно:
                  1. Используются стандартные средства, упрощающие работу и более понятные для понимания. При этом код говнянен из-за кучи Button1, Button2 итд.
                  2. Используются велосипеды, ибо стандартные средства - не Ъ.
                  3. Используются стандартные средства, причём используются на полную и грамотно.
                  Ответить
          • ...
            WinAPI?
            WinAPI!
            ....
            + wine = PROFIT!
            Ответить
        • И вообще рекламируя GetFileSizeEx, вы тем самым противоречите переносимости даже в семействе OS Windows.
          Ответить
    • А вдруг устройство не блочное?
      Ответить

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