C fwrite и размер файла

Меня смущает странная проблема. Когда я делаю что-то вроде ниже:

FILE* fl;
int* d = new int[3];
d[0] = -3;
d[1] = -3;
d[2] = -3;

plik = fopen("E:\data.txt","r+b");
fwrite((char*)d, sizeof(int), sizeof(int)*3, fl);
fclose(fl);
system("pause");

Он правильно записывает некоторые данные в файл, который я могу очистить в блокноте и получить размер файла 0B. Но если я изменю -3 на -2:

FILE* fl;
int* d = new int[3];
d[0] = -2;
d[1] = -2;
d[2] = -2;

plik = fopen("E:\data.txt","r+b");
fwrite((char*)d, sizeof(int), sizeof(int)*3,fl);
fclose(fl);
system("pause");

в результате, когда я очищаю данные в Блокноте и сохраняю файл, он всегда имеет 2B и не может быть очищен до конца. В чем проблема?. Заранее спасибо.


person Damian    schedule 06.12.2013    source источник
comment
Обратите внимание, что fwrite, fclose и т. д. - это не C++, а C. Соответственно отредактировал ваш вопрос.   -  person Max Truxa    schedule 06.12.2013
comment
Измените путь на "E:\\data.txt". В противном случае вы можете не открыть правильный файл для записи.   -  person timrau    schedule 06.12.2013
comment
Оператор @Qntm new[] - это C++, а не C.   -  person timrau    schedule 06.12.2013


Ответы (3)


Вы записываете двоичные данные в файл, а затем открываете его в текстовом редакторе. Результат НЕОПРЕДЕЛЕН. Когда вы видите слово «UNDEFINED» в документации, обратите внимание. Это ваша обязанность не делать таких вещей. Текстовый редактор предназначен для открытия текстовых файлов, то есть строк. Чтобы записать int в текстовый файл, нужно сделать что-то вроде:

char str[BIGNUMBER];
sprintf(str, "%d", d[0]);
fwrite...

Вероятно, это не то, что вы хотели, но это единственный способ получить текстовый файл, совместимый с Блокнотом. Что вы, вероятно, захотите сделать, так это найти редактор двоичных файлов, который может открывать, отображать и редактировать двоичные файлы. Лично я просто использую vim с параметром -b даже в Windows.

person Michael Dillon    schedule 06.12.2013
comment
Этот код не делает для меня ничего полезного, просто наткнулся на него во время реализации моего проекта, где я потерял 2 часа, чтобы справиться с тем, что создает проблему, а затем мне стало интересно, в чем причина этого. Но я думаю, что вы правы, спасибо всем за вашу помощь. - person Damian; 06.12.2013
comment
Не уверен, почему вы говорите, что это не определено? Байты в файле известны — и, предположительно, известно поведение конкретного редактора при обнаружении таких байтов. Вполне вероятно, что их нельзя преобразовать в видимый символ, но это другое. На какую документацию вы ссылаетесь? Голосую за определение основной причины, хотя я не согласен с некоторыми из ваших слов. - person Floris; 06.12.2013
comment
@Floris, да, байты в файле известны, и они не соответствуют спецификации текстового файла. Поэтому результат открытия файла каким-либо случайным текстовым редактором, который ожидает загрузки текстовых файлов, не определен. Попробуйте провести эксперимент. Скопируйте PDF-файл и измените имя на something.doc. Затем загрузите его в текстовый процессор. Вы видите документ на экране? - person Michael Dillon; 11.12.2013
comment
Ах - ключ с каким-то случайным текстовым редактором. Для конкретного редактора поведение может быть известно, но не для любого (по указанной вами причине). Мне не нужно проводить эксперимент, который вы предлагаете - я знаю, что вы имеете в виду. - person Floris; 11.12.2013

Блокнот явно путает данные, которые вы пишете, с меткой порядка следования байтов в Юникоде и попадает в некоторые забавные ситуации. штат.

Подумайте, как данные, которые вы пишете, будут выглядеть в двоичном виде и что они могут сделать с текстовым редактором.

person oakad    schedule 06.12.2013

когда вы открываете файл, вы назначаете его имени переменной plik

plik = fopen("E:\data.txt","r+b");

но вы пишете в переменную fl, которая не инициализирована.

fwrite((char*)d, sizeof(int), sizeof(int)*3,fl);

И размер для записи не должен умножаться на sizeof(int).

fwrite((char*)d, sizeof(int), 3,fl);
person unbound    schedule 06.12.2013
comment
fl в моем коде называется plik, у меня была ошибка при редактировании и вставке его сюда, и это не проблема. Я изменил "E:\data.txt" на "E:\\data.txt", но это не помогло. Вообще проблема с номером -2, когда я вставляю что-нибудь еще в код ниже, все нормально: FILE* plik; int d=-2; int* a=&d; plik=fopen("E:\\data.txt","r+b"); fwrite((char*)a,sizeof(int),sizeof(int),plik); fclose(plik) - person Damian; 06.12.2013