fwrite()

Тема в разделе "WASM.WIN32", создана пользователем tr1cker, 30 дек 2005.

  1. tr1cker

    tr1cker New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2005
    Сообщения:
    20
    всех с наступающим!

    недавно проводил анализ винды.

    и обнаружил одну странность.



    вот код:


    Код (Text):
    1.  
    2. #include <stdio.h>
    3. #include <string.h>
    4.  
    5. char data[]=
    6. "\x0A";
    7.  
    8. int main()
    9. {
    10. FILE *file;
    11. file = fopen("re.fff", "w+");
    12. fwrite(data, 1, sizeof(data)-1, file);
    13. }
    14.  




    по алгоритму должен быть создан файл re.fff с содержимым внутри 0x0A в hex (если открывать через hex-редактор), но вот создается файл re.fff, только его содержимое получается такое: 0x0D, 0x0A (в hex).



    продизасмил fwrite() в msvcrt.dll, но ничего странного не нашел.

    разъясните, пожалуйста, кто знает в чем трабла.

    заранее благодарен, и с наступающим :)
     
  2. tr1cker

    tr1cker New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2005
    Сообщения:
    20
    тестил на Windows XP SP2 RUS, компилятор Borland C++ 5.05 и Visual C++ 7.0
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Если файл открыт в текстовом режиме, fwrite заменяет 0xA на 0xD + 0xA.



    Открывайте файл так:
    Код (Text):
    1. file = fopen("re.fff", "w+[b]b[/b]");
     
  4. tr1cker

    tr1cker New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2005
    Сообщения:
    20
    Спасибо большое за ответ!



    А вообще для чего нужно добавлять 0xD??
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    В винде используется комбинация CRLN (0xD + 0xA) в качестве маркера новой строки. В *никсах используется просто 0xA. Т.к. fwrite - стандартная сишная функция, МС попыталась сделать её "кроссплатформенной" и, чтобы учесть эту тонкость с 0x0A0D vs. 0x0A, в текстовом режиме автоматически добавляет 0xD.