Как fwrite () два разных вида переменных в структуре? - PullRequest
0 голосов
/ 12 мая 2019

Я бы хотел добавить в файл массив типа «struct classes» (определение приведено ниже). Например, если allClasses[0].title равно "Math", а allClasses[0].class_id равно 1, я бы хотел, чтобы файл имел следующий ввод:

1Math/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0

Если добавлен другой класс с заголовком Science, тогда файл должен выглядеть так:

1Math/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/02Science/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0

То, что, похоже, происходит, - то, что, хотя код перехватит часть структуры char в массиве (математика / наука в примере), у него будут проблемы с int, и вместо этого он выведет мусор вместо него (и мусор) часто в разы длиннее 1 символа / 1 int).

Исходя из опыта, формат кода (с небольшими корректировками, конечно) прекрасно работает при использовании структуры с переменными, которые являются только массивами символов. Тем не менее, он дает сбой при использовании целых Это из-за преобразований ASCII или чего-то подобного? Как я могу настроить код так, чтобы я получал входные данные как с массивом int, так и с массивом char?

void addClasses(char *given_title) {

FILE *fp;
fp = fopen("classes.db", "r");

if (numClasses == 0 && fp != NULL) {
    findClasses();
}

strcpy(allClasses[numClasses].title, given_title);
allClasses[numClasses].class_id = numClasses + 1;
numClasses++;

fclose(fp);

fp = fopen("classes.db", "w");

for (int i = 0; i < numClasses; i++) {
    struct classes *object = malloc(sizeof(struct classes) - 1);
    memset(object, 0, sizeof( struct classes ));

    object->class_id = allClasses[i].class_id;
    strcpy(object->title, allClasses[i].title);

    fseek(fp, numClasses * (sizeof(struct classes) - 1), SEEK_END);
    fwrite(object, sizeof(struct classes) - 1, 1, fp);
}
fclose( fp );
}

Структура:

struct classes {
   int class_id;
   char title[30];
};

Немного дополнительного (возможно ненужного) фона для некоторых компонентов в коде: бит в начале метода пытается прочитать файл и начать заполнять массив любыми структурами, которые уже были помещены в файл перед запуском программы. Я не включаю код для этого, так как вышеупомянутый сбой происходит, даже когда у меня есть новый файл classes.db (и, следовательно, даже когда findClasses() никогда не запускается).

Кстати, небольшая заметка: я не могу изменить class_id на массив char / char. Это должно быть Int.

1 Ответ

1 голос
/ 12 мая 2019

Если вы хотите добавить его в текстовой форме:

fprintf(fp, "%d,\"%s\"\n", object -> class_id, object -> title);

когда вы открываете файл с помощью "w", вы создаете новый пустой файл. Когда вы пишете в файл, вам нужно fseek.

Если вы хотите добавить в существующий файл, используйте вместо него «a» или «a +».

...