728x90
C언어에서 이진 파일에 여러 값을 저장하고 이를 다시 출력해보자
이진 파일에 int 배열, float 배열 그리고 구조체 배열의 값을 저장할 것이다.
이때 이진 파일의 가장 윗줄에 int 배열의 개수, float 배열의 개수 그리고 구조체 배열의 크기를 저장할 것이다.
그리고 int 배열의 값, float 배열의 값 그리고 구조체 배열의 값을 순서대로 저장할 것이다.
이후 파일의 맨 윗줄의 배열들의 개수를 읽어, int 배열, float 배열 그리고 구조체 배열의 메모리를 할당하고 값을 저장해 출력할 것이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define intarrlen 5 //int 배열의 크기
#define floatarrlen 5 //float 배열의 크기
#define structarrlen 3 // 구조체 배열의 크기
//구조체 선언
typedef struct vector_s {
float x;
float y;
float z;
}vector_s;
int main()
{
FILE* fp = fopen("example.txt", "wb"); //이진 파일 형태로 파일 쓰기
//맨 윗줄에 배열의 개수 쓰기
int a = intarrlen, b = floatarrlen, c = structarrlen;
fwrite(&a, sizeof(int), 1, fp);
fwrite(&b, sizeof(int), 1, fp);
fwrite(&c, sizeof(int), 1, fp);
//int 배열의 값 설정 및 파일에 쓰기
int irr[] = { 1,2,3,4,5 };
for (int i = 0; i < intarrlen; i++) {
fwrite(&irr[i], sizeof(int), 1, fp);
}
//float 배열의 값 설정 및 파일에 쓰기
float frr[] = { 1.1,2.2,3.3,4.4,5.5 };
for (int i = 0; i < floatarrlen; i++) {
fwrite(&frr[i], sizeof(float), 1, fp);
}
//구조체 배열의 값 설정 및 파일에 쓰기
vector_s st[structarrlen] = {
{1.1,1.2,1.3},
{2.1,2.2,2.3},
{3.1,3.2,3.3},
};
for (int i = 0; i < structarrlen; i++) {
fwrite(&st[i].x, sizeof(float), 1, fp);
fwrite(&st[i].y, sizeof(float), 1, fp);
fwrite(&st[i].z, sizeof(float), 1, fp);
}
fclose(fp); //파일 닫기
FILE* in = fopen("example.txt", "rb"); //이진 파일 형태로 파일 읽기
//맨 윗줄의 배열의 크기를 읽어 변수에 저장하기
int lenarr=0, lenfrr=0, lenst=0;
fread(&lenarr,sizeof(int),1,in);
fread(&lenfrr, sizeof(int), 1, in);
fread(&lenst, sizeof(int), 1, in);
int* arr = (int*)malloc(sizeof(int) * lenarr);//int 배열을 lenarr 크기만큼 할당
fread(arr,sizeof(int), lenarr, in); //이진파일에 있는 int 값을 arr 크기만큼 읽어오기.
//배열에 저장한 값 출력하기
for (int i = 0; i < lenarr; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr);//할당한 arr 메모리 없애기
float* brr = (float*)malloc(sizeof(float) * lenfrr); //flaot 배열을 lenfrr 크기만큼 할당
fread(brr, sizeof(float), lenfrr, in); //이진파일에 있는 float 값을 lenfrr 크기만큼 읽어오기.
//배열에 저장한 값 출력하기
for (int i = 0; i < lenfrr; i++) {
printf("%f ", brr[i]);
}
printf("\n");
free(brr);//할당한 brr 메모리 없애기
vector_s* sts = (vector_s*)malloc(sizeof(float)*lenst); //구조체 배열을 lenst 크기만큼 할당
//이진파일에 있는 float값을 읽어 구조체 배열에 저장하기
for (int i = 0; i < lenst; i++) {
fread(&sts[i].x, sizeof(float), 1, in);
fread(&sts[i].y, sizeof(float), 1, in);
fread(&sts[i].z, sizeof(float), 1, in);
}
//배열에 저장한 값 출력하기
for (int i = 0; i < lenst;i++) {
printf("%f %f %f\n", sts[i].x, sts[i].y, sts[i].z);
}
free(sts);//할당한 sts 메모리 없애기
fclose(in);// 파일 닫기
}
실제로는 이진파일의 형태로 저장되기에 아래의 형태와 다르게 저장되고 읽어오나 이해를 돕기 위해 파일에 저장되는 값을 표현하면 이러한 값이 파일에 저장된다.
5 5 4
1 2 3 4 5 1.1 2.2 3.3 4.4 5.5 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 |
728x90
'코딩 > 잡다한 C언어' 카테고리의 다른 글
전위 순회 구현 (0) | 2023.11.30 |
---|---|
후위 순회 구현 (0) | 2023.11.29 |
C언어로 Single Linked List 구현하기 (0) | 2023.06.02 |
C언어로 Midi 입력을 받는 코드 만들기 (0) | 2023.05.24 |
C언어로 간단하지만 있어 보이는 계산기 만들기 (1) | 2023.03.30 |