Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Лишний байт в файле после записи


Автор: Ofer 12.4.2009, 15:23
Всех с днем Космонавтики!!!!
А теперь вопрос smile
Записываю в файл посимвольно числовые данные
Код

//---------------------------------------------------------------------------
#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main()
{
    FILE *f;
    char c[128];
    for(int i = 0;i < 128;i++)
     c[i] = i;
    f = fopen("D:\\outfile","w");
    for(int i = 0;i < 128;i++)
     fputc(c[i],f);
    fclose(f);
    return 0;
}
//---------------------------------------------------------------------------

По идее, должен иметь на выходе фалй "outfile" размером 128байт. Но получаю 129 байт. Просмтриваю его и вижу
Код

00 01 02 03 04 05 06 07 08 09 [color=red]0D[/color] 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F

Спрашивается: откуда взялся этот злополучный 0D?
З.Ы. Другие эксперименты показали, что он появляется исключительно перед числом 0A. То бишь перед ASCII символом '\n'

Автор: zim22 12.4.2009, 15:32
0D 0A - это так в ассемблере возврат каретки и перевод на новую строку обозначается.

Добавлено через 1 минуту и 29 секунд
Цитата(Ofer @  12.4.2009,  15:23 Найти цитируемый пост)
То бишь перед ASCII символом '\n'

\r\n в файле было

Автор: Ofer 12.4.2009, 15:37
Как в таком случае сделать, чтоб в файл записывалось лишь число 0A?

Автор: GoldFinch 12.4.2009, 15:43
Цитата(zim22 @  12.4.2009,  16:32 Найти цитируемый пост)
0D 0A - это так в ассемблере

он так везде обозначается %)

Автор: Soah 12.4.2009, 15:50
Код

    f = fopen("D:\\outfile","wb");

?

Автор: Ofer 12.4.2009, 16:14
Soah, премного благодарен!!!

Автор: J0ker 13.4.2009, 00:25
Цитата(zim22 @  12.4.2009,  15:32 Найти цитируемый пост)
0D 0A - это так в ассемблере возврат каретки и перевод на новую строку обозначается.

при чем тут ассемблер
это так конец строки в винде обозначается
при использовании функций ввода/вывода все "\n" транслируются в "\r\n" и наоборот
что-бы избежать этого надо открывать файл в бинарном режиме

Автор: GoldFinch 13.4.2009, 00:39
Цитата(J0ker @  13.4.2009,  01:25 Найти цитируемый пост)
это так конец строки в винде обозначается

в DOS было тоже самое
это стандартные управляющие ascii коды, поидее они в любой системе должны быть такими же

Автор: J0ker 13.4.2009, 03:56
Цитата(GoldFinch @ 13.4.2009,  00:39)
Цитата(J0ker @  13.4.2009,  01:25 Найти цитируемый пост)
это так конец строки в винде обозначается

в DOS было тоже самое
это стандартные управляющие ascii коды, поидее они в любой системе должны быть такими же

ну раз в винде то дос подразумевается
по идее должно быть так, как было сделано изначально
\r - это возврат каретки - в юниксе \n подразумевал переход на первую позицию следующей строки - т.е. конец строки только \n - все остальное от лукагого

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)