728x90
반응형
간단하게 파일에 내용을 가져와서 사용을 해야 할 일이 있어서 테스트겸 만들어 보았다.
C++을 잘 사용 할 줄몰라서 C/C++를 혼용하여 사용 하였으면 최종 데이터 저장 컨테이너는
map으로 사용 하였고, 멀티맵을 하지 않은 이유는 겹치는 key는 발생 할 일이 없을 것으로 판단 하였다.
테스트 파일 원본.
//YAS.
DEMO 3
//Tuen.
TONVOLUME 22
//Max T
MAXVOLUME 45
//Reset Timer
RESETTIMER 0
//KEY PATEERN
KEY 2
//USBPLAY
//USBREPEAT ALL
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cstring>
#include <map>
#include <vector>
using namespace std;
typedef struct {
string key;
string value;
}USB_DATA;
map<string, string> mapData;
int TrimRight(char *p)
{
int len = strlen(p);
if(len <= 0)
{
p[0] = 0;
return 0;
}
else
{
len--;
while(len)
{
if((unsigned char)p[len] > ' ') break;
p[len] = 0;
len--;
}
}
return strlen(p);
}
bool parsingData(char* str)
{
int cnt = 1;
char *tok = NULL;
USB_DATA t_data;
if(str != NULL)
{
if(str[0] == '/' && str[1] == '/')
{
return false;
}
TrimRight(str);
tok = strtok(str, " ");
if(tok == NULL)
{
return false;
}
t_data.key = tok;
tok = strtok(NULL, " ");
if(tok == NULL)
{
return false;
}
t_data.value = tok;
}
//printf("struct data[%s][%s]\n",t_data.key.c_str(), t_data.value.c_str());
mapData.insert(make_pair(t_data.key, t_data.value));
return true;
}
bool getDataFile()
{
FILE *fp = fopen("demo_mode3.txt","r");
int len = 0, total = 0;
char buff[64] = {0,};
if(fp == NULL)
{
printf("file open fail\n");
return false;
}
char *p;
while(!feof(fp))
{
p = fgets(buff, sizeof(buff), fp);
if(p != NULL)
parsingData(p);
}
fclose(fp);
return true;
}
void print_map()
{
for(auto itr = mapData.begin(); itr != mapData.end(); ++itr)
{
cout << "key : " << itr->first << ", " << "value : " << itr->second << endl;
}
}
int main(void)
{
printf("Program parsing\n");
getDataFile();
print_map();
return 1;
}
결과 값.
위의 결과에서 주석은 제거, 빈공간 제거등을 하여서 데이터만 가져오도록 하였고,
데이터 구분은. ' '(스페이스)로 처리 되어있다.
728x90
'프로그래밍 > C++' 카테고리의 다른 글
[C/C++] 문자열 입력시 공백 포함하기 (0) | 2021.01.15 |
---|---|
[로또프로그램] 코딩 연습용 로또 프로그램 제작 (0) | 2020.12.31 |