читать двоичный код записи в строку c

122
16

Итак, я просмотрел интернет и пару вопросов здесь, и я не мог найти ничего, что могло бы решить мою проблему здесь. У меня есть назначение для программирования на C, чтобы написать программу, которая позволяет пользователю вводить слова в строку, добавлять больше слов, помещать все слова в строку в текстовый файл, удалять все слова в строке, а когда они выходят из нее, слова в двоичном формате, который загружается при повторном запуске программы. Я получил все, чтобы работать, кроме случаев, когда речь идет о двоичном коде.

Я выполнил две функции: загрузку файла bin при запуске программы, которая сохраняет файл bin, когда он заканчивается. Я не знаю, в какой, или если в обоих случаях проблема начинается. Но в основном я знаю, что это не работает правильно, потому что я получаю мусор в текстовом файле, если я сохраняю его в текстовом файле после того, как программа загружает файл bin в строку. Я точно знаю, что заставка текстового файла работает правильно.

Спасибо всем, кто принимает время, чтобы помочь мне, это был целый день! лол

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

SIZE - это константа 10000, чтобы соответствовать спецификациям программы 1000 слов. Но я не мог заставить это работать даже просить только 10 элементов или 1, просто чтобы очистить это

void loadBin(FILE *myBin, char *stringAll) {
myBin = fopen("myBin.bin", "rb");
if (myBin == NULL) {
saveBin(&myBin, stringAll);
}//if no bin file exists yet

fread(stringAll, sizeof(char), SIZE + 1, myBin);

fclose(myBin); }

/

void saveBin(FILE *myBin, char *stringAll) {
int stringLength = 0;
myBin = fopen("myBin.bin", "wb");

if (myBin == NULL) {
printf("Problem writing file!\n");
exit(-1);

stringLength = strlen(stringAll);
fwrite(&stringAll, sizeof(char), (stringLength + 1), myBin);
fclose(myBin); }

спросил(а) 2018-05-25T01:07:00+03:00 2 года, 4 месяца назад
1
Решение
126

Вы оставляете плохие значения в своем myBin FILE * и передаете & (адрес) указателя.

Передайте имя файла, и вы можете (повторно) использовать функции для других целей, других файлов и т.д.

char* filename = "myBin.bin";

Передайте имя файла, указатель буфера и максимальный размер для чтения. Вы должны рассмотреть возможность использования stat/fstat для определения размера файла

size_t loadBin(char *fn, char *stringAll, size_t size)
{
//since you never use myBin, keep this FILE* local
FILE* myBin=NULL;
if( NULL == (myBin = fopen(fn, "rb")) ) {
//create missing file
saveBin(fn, stringAll, 0);
}//if no bin file exists yet
size_t howmany = fread(stringAll, sizeof(char), size, myBin);
if( howmany < size ) printf("read fewer\n");
if(myBin) fclose(myBin);
return howmany;
}

Передайте имя файла, указатель буфера и размер, чтобы сохранить

size_t saveBin(char *fn, char *stringAll, size_t size)
{
int stringLength = 0;
//again, why carry around FILE* pointer only used locally?
FILE* myBin=NULL;
if( NULL == (myBin = fopen("myBin.bin", "wb")) ) {
printf("Problem writing file!\n");
exit(-1);
}
//binary data may have embedded '\0' bytes, cannot use strlen,
//stringLength = strlen(stringAll);
size_t howmany = fwrite(stringAll, sizeof(char), size, myBin);
if( howmany < size ) printf("short write\n");
if(myBin) fclose(myBin);
return howmany;
}

Назовите их; вы не можете писать и читать одинаковые размеры...

size_t buffer_size = SIZE;
char buffer[SIZE]; //fill this with interesting bytes
saveBin(filename, buffer, buffer_size);
size_t readcount = loadBin(filename, buffer, buffer_size);

ответил(а) 2018-05-25T03:24:00+03:00 2 года, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема