Почему выскакивает warning, после чего ошибка сегментации?

Записываю структуру в файл, каждое поле пишу отдельно, поля типа char пишутся без ошибок, а вот uint8_t или обычный int не может записаться, выскакивает предупреждение на стадии компиляции, а при работе уже идет ошибка сегментирования. Что делать?
Пишу под Linux
Ошибка в этой строке:
fwrite(structFile->fileCountBlocks, sizeof(uint8_t), 1, archiv);

Код:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>

#define SIZEBLOCK 256

struct File {
	char fileName[64];
	char fileContent[SIZEBLOCK];
	uint8_t fileCountBlocks;
};

void archivingFile(FILE *thisFile, char *name) {
	FILE *archiv = fopen("FileArchiv", "wb");
	if (archiv == NULL) {
		printf("Couldn't create file archive!\n");
		return;
	}
	
	struct File *structFile = malloc(sizeof(struct File));

	strcpy(structFile->fileName, name);

	fseek(thisFile, 0, SEEK_END);
	uint32_t size = ftell(thisFile);
	fseek(thisFile, 0, SEEK_SET);
	
	structFile->fileCountBlocks = size / SIZEBLOCK + 1;
	
	fwrite(structFile->fileName, sizeof(structFile->fileName), 1, archiv);
	for (uint8_t i = 0; i < structFile->fileCountBlocks; i++)
	{
		fread(structFile->fileContent, SIZEBLOCK, 1, thisFile);
		fwrite(structFile->fileContent, SIZEBLOCK, 1, archiv);
	}

	printf("[%i blocks][%u bytes] %s\n", structFile->fileCountBlocks, size, structFile->fileName);
	// Если убрать строку, то сегментирования не будет и отработает все как надо, НО мне нужна переменная
	fwrite(structFile->fileCountBlocks, sizeof(uint8_t), 1, archiv);

	free(structFile);
	fclose(archiv);
}

void preparationForArchiving() {
	char *name = NULL;
	printf("Enter folder or file name: ");
	scanf("%ms", &name);
	printf("\n");
	DIR	*dir	= opendir(name);

	if (dir == NULL) {
		FILE *file = fopen(name, "rb");
		if (file == NULL) {
			printf("Can't open folder or directory: %s\n", name);
			return;
		} else {
			archivingFile(file, name);
		}
	} else {
		//archivingDir();
	}
	free(name);
}

int main(void) {
	preparationForArchiving();
}
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
15432
@15432
Системный программист ^_^
Функция fwrite на вход принимает указатель, с которого брать данные. Вы же подсовываете вместо адреса значение байта. Нужно передавать указатель на переменную:
fwrite(&structFile->fileCountBlocks, sizeof(uint8_t), 1, archiv);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы