читать запись двоичного файла в строку с - PullRequest
0 голосов
/ 25 мая 2018

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

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

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

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

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); }

1 Ответ

0 голосов
/ 25 мая 2018

Вы оставляете неверные значения в своем ФАЙЛЕ myBin * и передаете & (адрес) указателя.

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

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);
...