Друзья! Ну, то есть я делаю так: создаю строку нужного размера и определённого содержания и перегоняю её в файл. Но вот закавыка, если строка 10 байт или 100 (круглые числа беру для лёгкости), то и файл создаётся такого же размера. Но! Если я перегоняю в файл 1000, 10000, 100000 и так далее байтов, то он по факту оказывается большим! Если перегоняю 10000 байт, то файл оказывается размером, к примеру, 10038 байт. Речь не идёт о месте на диске которое он занимает, он ПО ФАКТУ БОЛЬШЕ, смотрю в "свойствах" или в hex- редакторе hiew) Вот прога, в ней всё понятно. Сперва заполняю строку нужным содержанием (в данном примере случайными байтами, чтобы двух повторяющихся рядом не было, но это деталь неважная), потом открываюфайл на чтение, потом перегоняю строку в файл. Код (Text): #include <stdio.h> #include <stdlib.h> #include <time.h> #define razmer 10000 int main () { long int i; unsigned char temp; srand (time(0)); unsigned char* array= new unsigned char [razmer]; for (i= 0; i< razmer; i++) { while (temp== array [i- 1]) temp= rand ()%256; array [i]= temp; } FILE* f; if (!(f= fopen ("rez", "w"))) { printf ("fail na zapis ne otkrit\n"); system ("pause"); return 0; } for (i= 0; i< razmer; i++) { fputc (array [i], f); // printf ("i= %d\n", i); } fclose (f); // system ("pause"); } ...Причём, в этом примере, если расскоментировать комментарии, то увидиим выведенное значеие i Код (Text): ... i= 9994 i= 9995 i= 9996 i= 9997 i= 9998 i= 9999 Для продолжения нажмите любую клавишу . . . Всё верно, перегнано 10000 байтов. Но файл оказывается 10045 байта... Помогите, друзья!
Открывать файл в бинарном режиме и будет счастье. Иначе каждый байт 0x0D при записи преобразуются в последовательность 2х байт 0x0A 0x0D fopen ("rez", "wb")
roman_pro, спасибо, помогло. Но! Возникли новые вопросы. Значит, символ перехзода на новую строку преобразуется в таковой+ перевод каретки? Очень хорошо! Налицо текстовый ввод и текстовый файл. А в нёмб наверное, не должен присутствовать символ 0X00 по крайней мере... Проверим... В hiewe без труда находятся байты 0X00. коих в текстовом режиме быть не должно! Потому хотя бы, что символ 0X00 не отображается ни в одном текстовом редакторе... Ну, а помимо этой непонятности всё хорошо...
amvoz Текстовый режим открытия файла, и текстовые данные -- это не одно и то же. Просто есть определённые соглашения о представлении перевода строки. И чтобы каждая программа не продиралась бы сквозь эти соглашения самостоятельно придумали текстовый формат открытия файла. Файл точно так же может содержать какие угодно байты, но просто при вводе/выводе производятся определённые замены.
а в линуксе 10000 потому что в библиотка си для линуксовых текстовых файлов транслирует 0xa в один символ 0xa там только перевод строки так и есть а в винде заменяется на два байта