подсчет контрольной суммы файла

Тема в разделе "LANGS.C", создана пользователем dps86, 26 май 2009.

  1. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    есть файл. нужно подсчитать его контрольную сумму и вывести в 16ом коде.
    написал для этого небольшую прогу, параметром к которой является сам подсчитываемый файл.

    вот прога (есть левые инклюды, эксперементировал просто. особо не заморачивайтесь)

    #include <time.h>
    #include <fcntl.h>
    #include <io.h>
    #include <dos.h>
    #include <string.h>
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <sys/stat.h>


    main (int argc, char *argv[])
    {
    unsigned int count=0, res=0;
    int handle, byte_read=0;

    handle = open (argv[1],O_RDWR);
    //ставим указатель чтения на начало файла
    lseek(handle, 0L, SEEK_SET);

    while(!eof(handle))
    {
    read(handle, &count,1);
    res+=count;
    byte_read++;
    }
    close(handle);
    printf("byte_read= %d\n",byte_read);
    printf("res= %x",res);

    return 0;
    }

    внизу прикреплю сам файл, для которого нужно считать.
    ОСНОВНАЯ ПРОБЛЕМА!!!!!
    считал раньше этой же прогой контрольную сумму для других файлов, все работало. (почти! все же почему то байт 0x0d она пропускала и приходилось его потом отдельно учитывать)
    считаю для файла obmen.com и почему-то читается только первые 411 байт. остальные странным образом не учитываются. помогите разобраться
     
  2. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    файл
     
  3. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    блин, не знаю как файл прикрепить. 2 раза пытался.
    залил на файлообменник. 512байт
    http://ifolder.ru/12312760
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ё моё, когда же люди научаться читать мануалы. 0x0d - признак конца текстового файла.
    Открывай в бинарном режиме.
     
  5. prorok

    prorok New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    25
    Я обычно делаю так

    MapFileAndCheckSum(srenum_crc,&OLDCRC,&NEWCRC);
     
  6. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    спасибо за подсказку. но это не отменяет моего вопроса. в том файле, что я скинул, чтение стопориться вовсе не на 0x0d.
     
  7. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    кстати читал про 0x0d , что это конец текста. не думал что конец файла и конец текста одно и то же. попробую в бинарном
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    prorok
    смешная шутка с учетом что исходник а) под дос б) пе-сумма тут не при чем :lol:
     
  9. prorok

    prorok New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    25
    Great
    облажался)))
     
  10. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Booster
    не, 0x0D - возврат каретки, DOS-овский перевод строки - два байта 0x0D, 0x0A, при этом первый пропускается при стандартных операциях чтения.
    А конец файла - 0x1A.
    А чтобы таких ужасов не было, файл следует открывать в двоичном режиме, т.е. с флагом O_BINARY. ;)
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ustus
    Я в курсе, попутал, бывает.