Как создать файл ТОЧНОГО размера ОПРЕДЕЛЁННОГО содержания?

Тема в разделе "LANGS.C", создана пользователем amvoz, 14 май 2010.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья!

    Ну, то есть я делаю так: создаю строку нужного размера и определённого содержания и перегоняю её в файл.
    Но вот закавыка, если строка 10 байт или 100 (круглые числа беру для лёгкости), то и файл создаётся такого же размера. Но! Если я перегоняю в файл 1000, 10000, 100000 и так далее байтов, то он по факту оказывается большим! Если перегоняю 10000 байт, то файл оказывается размером, к примеру, 10038 байт. Речь не идёт о месте на диске которое он занимает, он ПО ФАКТУ БОЛЬШЕ, смотрю в "свойствах" или в hex- редакторе hiew)

    Вот прога, в ней всё понятно. Сперва заполняю строку нужным содержанием (в данном примере случайными байтами, чтобы двух повторяющихся рядом не было, но это деталь неважная), потом открываюфайл на чтение, потом перегоняю строку в файл.
    Код (Text):
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <time.h>
    4.  
    5. #define razmer 10000
    6. int main () {
    7.  long int i;
    8.  
    9.  unsigned char temp;
    10.  srand (time(0));
    11.  
    12.  unsigned char* array= new unsigned char [razmer];
    13.  for (i= 0; i< razmer; i++) {
    14.   while (temp== array [i- 1])
    15.    temp= rand ()%256;
    16.   array [i]= temp;
    17.  }
    18.  
    19.  
    20.  
    21.  FILE* f;
    22.  if (!(f= fopen ("rez", "w"))) {
    23.   printf ("fail na zapis ne otkrit\n");
    24.   system ("pause");
    25.   return 0;
    26.  }  
    27.  
    28.  
    29.  for (i= 0; i< razmer; i++) {
    30.   fputc (array [i], f);
    31. //  printf ("i= %d\n", i);
    32.  }
    33.  fclose (f);
    34. // system ("pause");
    35.  
    36. }
    ...Причём, в этом примере, если расскоментировать комментарии, то увидиим выведенное значеие i
    Код (Text):
    1.  
    2. ...
    3. i= 9994
    4. i= 9995
    5. i= 9996
    6. i= 9997
    7. i= 9998
    8. i= 9999
    9. Для продолжения нажмите любую клавишу . . .
    Всё верно, перегнано 10000 байтов. Но файл оказывается 10045 байта... Помогите, друзья!
     
  2. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Открывать файл в бинарном режиме и будет счастье. Иначе каждый байт 0x0D при записи преобразуются в последовательность 2х байт 0x0A 0x0D

    fopen ("rez", "wb")
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Видимо неправильно смотришь. У меня 10000.
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    У меня линукс, по-этому 10000. ^)
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    roman_pro, спасибо, помогло. Но! Возникли новые вопросы.
    Значит, символ перехзода на новую строку преобразуется в таковой+ перевод каретки? Очень хорошо! Налицо текстовый ввод и текстовый файл. А в нёмб наверное, не должен присутствовать символ 0X00 по крайней мере...

    Проверим... В hiewe без труда находятся байты 0X00. коих в текстовом режиме быть не должно! Потому хотя бы, что символ 0X00 не отображается ни в одном текстовом редакторе...

    Ну, а помимо этой непонятности всё хорошо...
     
  6. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    http://ru.wikipedia.org/wiki/Перевод_строки
     
  7. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    amvoz
    Текстовый режим открытия файла, и текстовые данные -- это не одно и то же. Просто есть определённые соглашения о представлении перевода строки. И чтобы каждая программа не продиралась бы сквозь эти соглашения самостоятельно придумали текстовый формат открытия файла. Файл точно так же может содержать какие угодно байты, но просто при вводе/выводе производятся определённые замены.
     
  8. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    только не 0xd в 0xa0xd а 0xa в 0xd0xa :)
     
  9. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    а в линуксе 10000 потому что в библиотка си для линуксовых текстовых файлов транслирует 0xa в один символ 0xa там только перевод строки так и есть а в винде заменяется на два байта :)