Недочёт в _write

Тема в разделе "WASM.WIN32", создана пользователем Cneg, 24 окт 2007.

  1. Cneg

    Cneg New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    78
    В файле write.c (c:\Program Files\Microsoft Visual Studio 8\VC\crt\src\) есть строки 286-294
    Код (Text):
    1. while ( q - lfbuf < sizeof(lfbuf) - 1 &&
    2.                             (unsigned)(p - (char *)buf) < cnt ) {
    3.                         ch = *p++;
    4.                         if ( ch == LF ) {
    5.                             ++lfcount;
    6.                             *q++ = CR;
    7.                         }
    8.                         *q++ = ch;
    9.                     }
    так вот если пытаться записать такую последовательность байт где будет 0D то в месте ch == LF будет равенство и в буфер для записи запишется лишнее CR!!! как это исправить, потому что надо писать все байты без всяких добавлений! Примечание: используя только _write! Правка write.c черевата ибо он используется вообще везде!
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Cneg
    Это происходит, если открывать файл для работы с текстом, т.е., например fopen (FileName, "wt");. Если t убрать ничего дописываться не будет.
    [+]
    IMHO не в том разделе тема.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Cneg
    Есть бинарные и текстовые режимы работы с файлами в Си. Как уже отметили, w и wt.
    Почитай
     
  4. Cneg

    Cneg New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    78
    большое спасибо, да простят модераторы если не совсем в тему...
     
  5. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    По умолчанию файл открывается в текстовом режиме, при котором комбинация символов "возврат каретки" и "перевод строки" при вводе преобразуются в одиночный символ перевода строки, а при выводе выполняется обратное преобразование. В двоичном режиме такие преобразования не выполняются.
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Да, кстати. Поэтому для работы с файлом как с бинарником нужно или дописывать "b" или вызывать _set_fmode (_O_BINARY); перед fopen.