Размер файла, каков он на самом деле =)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by VERte][, 28 Nov 2009.

  1. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    Собственно сел тут писякать программу шифрующую/расшифровывающую файлы по алгоритму aes. Вроде как все функции написал, прогнал тест на 128 битах текста, все тип-топ, ещё пару тестов из текстов слепленных из первого, все пашет. Загоняю текстик побольше, там какое-то интервью артиста, и получаю на выходе понятное дело хню - после шифровки+расшифровки получаю только часть текста, причем размер зашифрованного текста не удовлетворяет мои представлениям о том каким он должен быть, я естественно схватился за отладчик, и вот что получил, ещё на обработки исходного текста:

    [​IMG]

    как видите текст, который есть в блокнотике не совпадает с тем что VS получила, концы различаются.
    Далее ещё веселее - смотрю я на размер исходного текста, на то что выдает студия и на то сколько байт я таки считал на обработке текста, получаю такую вещь:

    1) что думает студия
    [​IMG]

    2) что думает винда
    [​IMG]

    3) и что я думаю (складываем count и writed)
    [​IMG]


    И вот ещё что: в самом конце считывание остановилось где надо, появилась буковка "я", которая как я понимаю обозначила конец файла, ибо это 0xFF, что впринципе и возвращает ifstream::get() при достижении конца файла.

    [​IMG]

    Так вот кто сталкивался с такими проблемами "размера файла", и если вдруг сталкивался, то как с ними бороться или с чем хотя бы они могут быть связаны? Использовал я для обработки данных файла функции класса fstream: put, get, eof.
    И ещё как оказалось, функция get не считывает например 0x1A, возвращая конец файла, поэтому то у меня и терялась часть файла при шифровании-расшифровании, вот сижу думаю какие функции использовать чтоб именно считывать все байты из файла без разбора, может кто что подскажет? (пока надумываю обратиться в сторону сишного fread, и все переписывать =( )
     
    #1 VERte][, 28 Nov 2009
    Last edited: 28 Nov 2009
    1 person likes this.
  2. .ATK

    .ATK Active Member

    Joined:
    20 Feb 2009
    Messages:
    143
    Likes Received:
    111
    Reputations:
    9
    Дай исходничок, на досуге повтыкаю...
     
  3. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    хехе, исходник, там щас черт ногу сломит ну в принципе вот http://stream.ifolder.ru/15195470, завтра если щас и с fread, fwrite не будет работать, выложу более менее норм обработанный, щас стоит только смотреть на то каким образом определяется размер файлов в студии при использовании класса fstream

    зы. впринципе fread, fwrite более результативны, но fread также вылетает встретив байт 0x1A, я в замешательстве =\

    pss с 0x1a все ясно, это маркер конца файла, избежать его можно считывая в бин.режиме. В принципе все робит теперь, но все же вопрос о размере файла при работе с fstream остается
    вот работающий исходник http://stream.ifolder.ru/15195870, осталось только это все заоптимайзить, ещё работы на день =)
     
    #3 VERte][, 28 Nov 2009
    Last edited: 28 Nov 2009
  4. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Тоже недавно столкнулся с таким поведением(непонятные байты из потока читаются). Ubuntu/g++. После долгого перерыва решил написать что-то на С++ - это оказалась лаба по криптографии - шифровщик файлов на основе простой сети Фейстеля. Возникла такая же проблема. Подумал что совсем забыл с++(не притрагивался года полтора - писал на java только) - погуглил, попробовал некоторые варианты - ничего не работало. После этого окончательно разочаровался в с++ как в языке программирования - слишком много времени на такую банальщину потратил и все безрезультатно - это просто позор для языка. Взял и переписал все на java - на это ушло времени в разы меньше чем гугление ошибки на с++. Все сразу заработало. На c# я уверен все так же реализуется без проблем.
     
  5. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    836
    Reputations:
    402
    я на дельфе подобную фигню писал - пользовал посимвольное считывание, т.к. все остальные функции запарываются на отдельных спец\нечитаемых символах, если открывать файл как textfile.

    хотя если открывать просто как file и использовать blockread - то вроде норм, хотя обрабатывать текст при этом не пробовал. Наверное норм будет, хз

    как в СИ не знаю, но сложности с этим видимо есть везде
     
    #5 ErrorNeo, 28 Nov 2009
    Last edited: 28 Nov 2009
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    вообще в Си есть такая классная фишка - тип char является числом со знаком.
    типа
    Code:
    	char m = 0x99;
    	char n = 0x20;
    	
    	if (n > m)
    	{
    		printf("n>m");
    	}
    
    выдаст n>m потому m будет считаться отрицательным и по этому при расчетах могут получаться неправильные значения. так что нужно всё считать в unsigned char

    А на счет считывания файлов, то юзай функции бинорной работы с файлом или апишки - через CreateFile откроеш файл. через GetFileSize получиш размер и через ReadFile считаеш скока нужно.
     
  7. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    2slesh
    интересовал чистый c++. не си, не api.