Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: DamianОтветов: 3

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

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 и не может быть очищен до конца. В чем проблема?. Заранее спасибо.

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

cfilefopenfwrite

Ответы

Ответ 1 · рейтинг 1 · Michael Dillon

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

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

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

Ответ 2 · рейтинг 1 · oakad

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

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

Ответ 3 · рейтинг 1 · unbound

когда вы открываете файл, вы назначаете его имени переменной 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);

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы