2019년도 2학기 소프트웨어공학 수업 과제물 flash memory 2차입니다.
1차에서보다 구조체에 대한 이해도가 올라간 모습이 보이네요.

main

#include "header.h"

FILE* fp; //데이터베이스 구축을위한 FILE형 포인텨변수 fp 선언
int Sect; //섹터를 입력받음
int Sect_Share; //섹터를 나눈 몫
int Sect_Remainder; //섹터를 나눈 나머지
char Input[30]; //입력데이터
int choice; //Flash_Read 함수에서 나오는 결과값
//---------------------------------------
int main(void) {
	Data_Load(); //최초 프로그램 실행 시 데이터로드

	char Autority[2]; //권한입력받음
	printf("┌------------------------------------------┐ \n");
	printf("│             < FLASH MEOMRY >             │ \n");
	printf("│------------------------------------------│ \n");
	printf("│ 권한입력: w = Write, r = Read, e = Erase │ \n");
	printf("│           x = Exit, i = Init             │ \n");
	printf("│ 섹터입력: 0~127 까지 원하는섹터를 입력   │ \n");
	printf("│ 문자입력: 섹터에 입력하려는 문자를 입력  │ \n");
	printf("└------------------------------------------┘ \n");
	while (1) {
		printf("------------------------------------------- \n");
		printf("권한입력:");
		scanf("%s", Autority);
		printf("섹터입력:");
		scanf("%d", &Sect);

		Sect_Share = Sect / 32;
		Sect_Remainder = Sect % 32;

		if (strcmp(Autority, "w") == 0) {
			FTL_Write();
		}
		else if (strcmp(Autority, "r") == 0) {
			FTL_Read();
		}
		else if (strcmp(Autority, "e") == 0) {
			Flash_Erase();
		}
		else if (strcmp(Autority, "i") == 0) {
			Init();
		}
		else if (strcmp(Autority, "x") == 0) {
			return 0;
		}
		else {
			printf("잘못된 접근입니다. \n");
		}
	}
}

void FTL_Write() {
	printf("문자입력:");
	scanf("%s", Input);

	Flash_Read(); //Flash_Read에서 choice에 대한 초기화값이 결정된다.
	if (choice == 0) {
		Flash_Write();
	}
	else if (choice == 1) {
		Flash_Erase();
		Flash_Write();
	}
	else {
		printf("취소되었습니다. \n");
	}
	Data_Save();
}

void FTL_Read() {
	switch (Sect_Share) {
	case 0:
		printf("%s \n", Block_0[Sect_Remainder].Text);
		break;
	case 1:
		printf("%s \n", Block_1[Sect_Remainder].Text);
		break;
	case 2:
		printf("%s \n", Block_2[Sect_Remainder].Text);
		break;
	case 3:
		printf("%s \n", Block_3[Sect_Remainder].Text);
		break;
	default:
		break;
	}
}

void Flash_Write() {
	switch (Sect_Share) {
	case 0:
		strcpy(Block_0[Sect_Remainder].Text, Input);
		Block_0[0].Sect = Sect_Remainder; //Data_Load() 함수에서 사용할 섹터값 저장
		break;
	case 1:
		strcpy(Block_1[Sect_Remainder].Text, Input);
		Block_1[0].Sect = Sect_Remainder;
		break;
	case 2:
		strcpy(Block_2[Sect_Remainder].Text, Input);
		Block_2[0].Sect = Sect_Remainder;
		break;
	case 3:
		strcpy(Block_3[Sect_Remainder].Text, Input);
		Block_3[0].Sect = Sect_Remainder;
		break;
	}
}

void Flash_Read() {
	char scan[30];

	switch (Sect_Share) {
	case 0://-------------------------------------------------
		fp = fopen("Block_0.txt", "rt");
		if (fscanf(fp, "%s", scan) > 0) { //fscanf 에 정수값이 반환될경우 choice값 선택
			printf("해당블록에 이미 데이터가 존재합니다 \n");
			printf("삭제하고 계속하시겠습니까? \n");
			printf("1. 예 \n2. 아니오 \n");
			printf("입력:");
			scanf("%d", &choice);
		}
		else if (fscanf(fp, "%s", scan) < 0) { //반환되지 않을경우 choice에 0을 대입
			choice = 0;
		}
		fclose(fp);
		break;
	case 1://-------------------------------------------------
		fp = fopen("Block_1.txt", "rt");
		if (fscanf(fp, "%s", scan) > 0) {
			printf("해당블록에 이미 데이터가 존재합니다 \n");
			printf("삭제하고 계속하시겠습니까? \n");
			printf("1. 예 \n2. 아니오 \n");
			printf("입력:");
			scanf("%d", &choice);
		}
		else if (fscanf(fp, "%s", scan) < 0) {
			choice = 0;
		}
		fclose(fp);
		break;
	case 2://-------------------------------------------------
		fp = fopen("Block_2.txt", "rt");
		if (fscanf(fp, "%s", scan) > 0) {
			printf("해당블록에 이미 데이터가 존재합니다 \n");
			printf("삭제하고 계속하시겠습니까? \n");
			printf("1. 예 \n2. 아니오 \n");
			printf("입력:");
			scanf("%d", &choice);
		}
		else if (fscanf(fp, "%s", scan) < 0) {
			choice = 0;
		}
		fclose(fp);
		break;
	case 3://-------------------------------------------------
		fp = fopen("Block_3.txt", "rt");
		if (fscanf(fp, "%s", scan) > 0) {
			printf("해당블록에 이미 데이터가 존재합니다 \n");
			printf("삭제하고 계속하시겠습니까? \n");
			printf("1. 예 \n2. 아니오 \n");
			printf("입력:");
			scanf("%d", &choice);
		}
		else if (fscanf(fp, "%s", scan) < 0) {
			choice = 0;
		}
		fclose(fp);
	default:
		break;
	}
}

void Flash_Erase() {
	switch (Sect_Share) {
	case 0:
		for (int i = 0; i < SECT; i++) {
			strcpy(Block_0[i].Text, ""); //구조체에 ""를 복사
		}
		break;
	case 1:
		for (int i = 0; i < SECT; i++) {
			strcpy(Block_1[i].Text, "");
		}
		break;
	case 2:
		for (int i = 0; i < SECT; i++) {
			strcpy(Block_2[i].Text, "");
		}
	case 3:
		for (int i = 0; i < SECT; i++) {
			strcpy(Block_3[i].Text, "");
		}
		break;
	}
	Data_Save();
}

void Init() {
	//동적할당 실패...
}

void Data_Load() {
	char line[30];
	int num;
	//--------------------------------------
	fp = fopen("Sect_0.txt", "a+");
	fscanf(fp, "%d", &num); //Sect.txt 파일에 저장된 문자를 정수값으로 num에저장
	fclose(fp);
	fp = fopen("Block_0.txt", "a+");
	for (int i = 0; i < num + 1; i++) { //num만큼 반복
		fgets(line, SECT, fp); //문자열을 한줄씩 입력받아
		strcpy(Block_0[i].Text, line); //구조체에 저장
	}
	fclose(fp);
	//--------------------------------------
	fp = fopen("Sect_1.txt", "a+");
	fscanf(fp, "%d", &num);
	fclose(fp);
	fp = fopen("Block_1.txt", "a+");
	for (int i = 0; i < num + 1; i++) {
		fgets(line, SECT, fp);
		strcpy(Block_1[i].Text, line);
	}
	fclose(fp);
	//--------------------------------------
	fp = fopen("Sect_2.txt", "a+");
	fscanf(fp, "%d", &num);
	fclose(fp);
	fp = fopen("Block_2.txt", "a+");
	for (int i = 0; i < num + 1; i++) {
		fgets(line, SECT, fp);
		strcpy(Block_2[i].Text, line);
	}
	fclose(fp);
	//--------------------------------------
	fp = fopen("Sect_3.txt", "a+");
	fscanf(fp, "%d", &num);
	fclose(fp);
	fp = fopen("Block_3.txt", "a+");
	for (int i = 0; i < num + 1; i++) {
		fgets(line, SECT, fp);
		strcpy(Block_3[i].Text, line);
	}
	fclose(fp);
}

void Data_Save() {
	//--------------------------------------
	fp = fopen("Block_0.txt", "wt");
	for (int i = 0; i < SECT; i++) {
		fprintf(fp, "%s\n", Block_0[i].Text); //구조체 내용 텍스트에 저장
	}
	fclose(fp);
	fp = fopen("Sect_0.txt", "wt");
	fprintf(fp, "%d", Block_0[0].Sect); //Data_Load() 함수를 위해 섹터값 저장
	fclose(fp);
	//--------------------------------------
	fp = fopen("Block_1.txt", "wt");
	for (int i = 0; i < SECT; i++) {
		fprintf(fp, "%s\n", Block_1[i].Text);
	}
	fclose(fp);
	fp = fopen("Sect_1.txt", "wt");
	fprintf(fp, "%d", Block_1[0].Sect);
	fclose(fp);
	//--------------------------------------
	fp = fopen("Block_2.txt", "wt");
	for (int i = 0; i < SECT; i++) {
		fprintf(fp, "%s\n", Block_2[i].Text);
	}
	fclose(fp);
	fp = fopen("Sect_2.txt", "wt");
	fprintf(fp, "%d", Block_2[0].Sect);
	fclose(fp);
	//--------------------------------------
	fp = fopen("Block_3.txt", "wt");
	for (int i = 0; i < SECT; i++) {
		fprintf(fp, "%s\n", Block_3[i].Text);
	}
	fclose(fp);
	fp = fopen("Sect_3.txt", "wt");
	fprintf(fp, "%d", Block_3[0].Sect);
	fclose(fp);
}
#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BLOCK 4
#define SECT 32

typedef struct {
	char Text[30];
	int Sect;
}BLOCKGUJO;
BLOCKGUJO Block_0[SECT];
BLOCKGUJO Block_1[SECT];
BLOCKGUJO Block_2[SECT];
BLOCKGUJO Block_3[SECT];

void FTL_Write();
void FTL_Read();
void Flash_Write();
void Flash_Read();
void Flash_Erase();
void Init();

void Data_Load();
void Data_Save();

태그:

Cpp

카테고리:

업데이트:

댓글남기기