Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- LayerMask
- 너비 우선 탐색
- 깊이 우선 탐색
- 유니티 리소스매니저
- 유니티 오브젝트 풀링
- Raycast
- 유니티
- eulerAngles
- unity
- 코드블럭 테마
- c++
- Quaternion.Euler
- LookRotation
- 유니티 Rotate
- 유니티 Collision
- git-lfs
- 유니티 ResourceManager
- LFS
- 유니티 InputManager
- 유니티 시야 가림
- 유니티 Vector3
- InputManager
- 이진트리
- Mathf.Clamp
- 알고스팟
- 유니티 머신러닝
- ML-Agents
- c++ 문자열 자르기
- 오브젝트 풀링
- 소스코드 줄번호
Archives
- Today
- Total
무민은귀여워
csv 파일 읽고 쓰기 본문
반응형
클래스명.h 헤더파일을 만들고 csv 파일을 읽어서 사용한다.
0. csv 파일 준비하기
엑셀 파일을 만들어서 csv파일로 내보내기.
내용은 아래와 같음.
[엑셀]
UniqueId | name | lane | role | price |
int | string | string | string | int |
1 | Ekko | top | AP | 6300 |
2 | Malphite | top | Tank | 1350 |
생략
[csv]
1
2
3
4
5
6
7
8
9
10
11
12
13
|
UniqueId,name,lane,role,price
int,string,string,string,int
1,Ekko,top,AP,6300
2,Malphite,top,Tank,1350
3,Master Yi,jungle,Split Pusher,450
4,Evelynn,jungle,AP,1350
5,Ahri,mid,Burst Mage,4800
6,VelKoz,mid,Poke Mage,6300
7,Vayne,bot,Hyperscale ADC,4800
8,Ezreal,bot,Mid game ADC,4800
9,Sona,bot,Enchanter,3150
10,Blitzcrank,bot,Pick,3150
|
cs |
1. 헤더파일 만들기
GENERATESTRUCT(생성할 클래스명, column, datatype) 을 이용해서 클래스명.h 헤더파일을 만든다.
실행하면 프로젝트 폴더에 헤더파일이 생성되어 있음.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
#define GENERATESTRUCT(Name, Column, DataType) \
string a(#Name); \
int index = 0; \
a.append(".h"); \
FILE* file = fopen(a.c_str(), "wt+"); \
fprintf(file, "#pragma once\n"); \
fprintf(file, "#include <string>\n"); \
fprintf(file, "#include <cstdlib>\n"); \
fprintf(file, "using namespace std;\n\n"); \
fprintf(file, "enum E%s{\n", #Name); \
while (index < column.size()) \
{ \
fprintf(file, "\te%s_%s,\n", #Name, column[index].c_str()); \
++index; \
} \
fprintf(file, "};\n\n"); \
fprintf(file, "class %s{\n", #Name); \
\
fprintf(file, "public:\n"); \
index = 0; \
while (index < column.size()) \
{ \
fprintf(file, "\t%s Get%s() const { return %s;}\n", DataType[index].c_str(), column[index].c_str(), column[index].c_str()); \
fprintf(file, "\tvoid Set%s(%s In%s){%s = In%s;}\n\n", column[index].c_str(), DataType[index].c_str(), column[index].c_str(), column[index].c_str(), column[index].c_str()); \
++index; \
} \
index = 0; \
fprintf(file, "\tvoid FillData(std::vector<string>& In){\n"); \
while (index < column.size()) \
{ \
if(!DataType[index].compare("int")) \
fprintf(file, "\t\tSet%s(atoi(In[e%s_%s].c_str()));\n", column[index].c_str(), #Name, column[index].c_str()); \
else if(!DataType[index].compare("float")) \
fprintf(file, "\t\tSet%s(atof(In[e%s_%s].c_str()));\n", column[index].c_str(), #Name, column[index].c_str()); \
else \
fprintf(file, "\t\tSet%s(In[e%s_%s].c_str());\n", column[index].c_str(), #Name, column[index].c_str()); \
++index; \
} \
\
fprintf(file, "\t}\n"); \
fprintf(file, "private:\n"); \
index = 0; \
while (index < column.size()) \
{ \
fprintf(file, "\t%s %s;\n", DataType[index].c_str(), column[index].c_str()); \
++index; \
} \
fprintf(file, "};"); \
fclose(file);
|
cs |
[ 결과 헤더파일 ]
이제 LoLChampion 이라는 클래스를 사용할 수 있다!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#pragma once
#include <string>
#include <cstdlib>
using namespace std;
enum ELoLChampion{
eLoLChampion_UniqueId,
eLoLChampion_name,
eLoLChampion_lane,
eLoLChampion_role,
eLoLChampion_price,
};
class LoLChampion{
public:
int GetUniqueId() const { return UniqueId;}
void SetUniqueId(int InUniqueId){UniqueId = InUniqueId;}
string Getname() const { return name;}
void Setname(string Inname){name = Inname;}
string Getlane() const { return lane;}
void Setlane(string Inlane){lane = Inlane;}
string Getrole() const { return role;}
void Setrole(string Inrole){role = Inrole;}
int Getprice() const { return price;}
void Setprice(int Inprice){price = Inprice;}
void FillData(std::vector<string>& In){
SetUniqueId(atoi(In[eLoLChampion_UniqueId].c_str()));
Setname(In[eLoLChampion_name].c_str());
Setlane(In[eLoLChampion_lane].c_str());
Setrole(In[eLoLChampion_role].c_str());
Setprice(atoi(In[eLoLChampion_price].c_str()));
}
private:
int UniqueId;
string name;
string lane;
string role;
int price;
};
|
cs |
2. 만들어진 헤더파일을 이용하여 객체를 생성하고, csv에서 내용을 읽어 저장한다.
참고. 사용할 csv 파일은 프로젝트 폴더 안에 넣어야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#include "LoLChampion.h"
// 생략
std::map<int, LoLChampion> LoLChampionData;
// 생략
// 메인 안
// 생략
FILE* fp = fopen("LoLChampion.csv", "rt");
vector<string> column;
vector<string> DataType;
CSVData::parse(fp, column);
CSVData::parse(fp, DataType);
// GENERATESTRUCT는 한번만 실행해주면 된다.
//GENERATESTRUCT(LoLChampion, column, DataType);
vector<string> Data;
while (CSVData::parse(fp, Data))
{
LoLChampion data;
data.FillData(Data);
LoLChampionData.insert(make_pair(data.GetUniqueId(), data));
Data.clear();
}
fclose(fp);
/* [ 출력하기 (아래내용) ]
Ekko | AP | 6300
Malphite | Tank | 1350
Master Yi | Split Pusher | 450
Evelynn | AP | 1350
Ahri | Burst Mage | 4800
VelKoz | Poke Mage | 6300
Vayne | Hyperscale ADC | 4800
Ezreal | Mid game ADC | 4800
Sona | Enchanter | 3150
*/
for (int i = 1; i < LoLChampionData.size(); i++)
{
cout << LoLChampionData.at(i).Getname() << " | " << LoLChampionData.at(i).Getrole() << " | " << LoLChampionData.at(i).Getprice() << endl;
}
|
cs |
반응형
'IT > c, c++' 카테고리의 다른 글
문자열 자르기 substr / istringstream / stringstream / strtok (0) | 2022.05.20 |
---|---|
스마트 포인터 ( unique_ptr, shared_ptr, weak_ptr ) (1) | 2021.05.18 |
같은 자료형인 두 값을 교환하는 함수 형식 매크로 ( swap 매크로 ) (0) | 2021.05.18 |
typedef 보다 별칭 선언을 선호하라 (0) | 2020.01.17 |
[c++] map 사용 예제 (0) | 2019.11.28 |
Comments