[C++]19. C++ 데이터 버퍼에 정보를 저장하기(데이터 버퍼에 정보를 저장하고 파일로 저장하기)
안녕하세요 고급 개발자가 꿈인 코린이 입니다.
오늘은 데이터 버퍼에 데이터를 저장하는 방법에 대해서 포스팅 하겠습니다.
프로그래밍을 하다보면 데이터 버퍼를 아주 많이 사용합니다. 데이터 버퍼를 이용해서 정보를 임시 저장했다가
특정한 시간이 되면 이 버퍼에 담긴 내용을 파일로 저장하거나 다른 앱에 전달하거나 하는등에 버퍼를 사용하는
내용은 프로그래밍에서 아주많이 사용하는 내용중에 하나 입니다.
그런데 이러한 내용을 막상 해보지 않으면 버퍼에 어떻게 담지?? 하면서 어려운 부분이 있습니다.
그래서 오늘은 데이터 버퍼에 정보를 저장하고 이내용을 파일에 담아서 파일을 확인하는 내용을 다루어 보겠습니다.
오늘 구현하는 내용은 쓰레드를 돌려서 1초에 한번씩 데이터 버퍼에 내용을 담고 이 담은 내용을 파일로 저장하는
내용을 구현해 보겠습니다.
데이터 버퍼에 담는 횟수가 10번이 되면 새로운 파일을 만들고 데이터 버퍼를 초기화 한후에 데이터를 저장하는
내용을 구현했는데요 아래 코드를 보면서 설명 드리겠습니다.
ServiceClass.hpp
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
|
#ifndef SERVICECLASSCECLASS_H
#define SERVICECLASSCECLASS_H
#include <iostream>
#include <vector>
#include <sstream>
#include <fstream>
class ServiceClass
{
public:
ServiceClass();
virtual ~ServiceClass();
private:
int mNum = 0;
std::ostringstream mDataBuffer;
std::ofstream mFile;
int mCount = 0;
int mFileCount = 0;
std::string mFileName;
std::string mFileFormat = ".txt";
public:
void saveDataBuffer(const char* data);
};
#endif // SERVICECLASSCECLASS_H
|
cs |
ServiceClass.cpp
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#include "ServiceClass.h"
#include <string.h>
#include <sys/stat.h>
#include <thread>
#include <unistd.h>
#define DATA_FILE "/home/shin/youonlyliveonce/dataBuffer"
ServiceClass::ServiceClass()
{
mFileName = DATA_FILE;
std::thread sendDataBuffer([&]() {//새로운 쓰레드를 만들어서 1초에 한번씩 쓰레드를 돌린다.
std::cout << "sendDataBuffer "<<std::endl;
bool loop = true;
while(loop){
std::string strValue;
mNum++;
for(int i = 0; i < mNum; i++)
{
strValue += std::to_string(i);//데이터를 1부터 추가되는 숫자까지 모두 변수에 넣어둔다.
if(i != mNum - 1){
strValue += ",";
}
std::cout << "strValue:" << strValue <<std::endl;
}
saveDataBuffer(strValue.c_str());//변수에 담은 내용을 데이터 버퍼에 담는다.
if (true == loop) {
sleep(1); // 1second
}
}
});
sendDataBuffer.detach();
}
ServiceClass::~ServiceClass()
{
}
void ServiceClass::saveDataBuffer(const char* data)
{
std::cout << "saveDataBuffer:" << data <<std::endl;
mCount++;
mFile.open(mFileName + mFileFormat);
mDataBuffer <<data<< std::endl; //버퍼에 데이터를 저장한다.
mFile << mDataBuffer.str();//데이터 버퍼에 담은 내용을 파일에 저장한다.
mFile.close();
if(mCount == 10){
mCount = 0;
mFileCount++;
mFileName = DATA_FILE + std::to_string(mFileCount);
mDataBuffer.str("");//버퍼에 담긴 내용을 초기화 해준다.
mDataBuffer.clear();//clear함수만 사용해서는 버퍼의 내용이 초기화가 안된다.
std::cout << "new file!! fileName:" << mFileName <<std::endl;
}
}
|
cs |
실행 결과
위의 실행결과를 보시면 dataBuffer라는 파일이 숫자 하나씩 증가하면서 파일이름이 변하고 그 안의 내용은
버퍼에 담은 내용을 저장하고 있는것을 확인할수가 있습니다.
여기서 버퍼에 담은 내용을 초기화 하였기 때문에 위의 이미지 처럼 데이터가 10줄씩 나오게 됩니다.
만약게 버퍼를 초기화 하지 않았다면 데이터의 제일 처음부터 끝까지 각 파일에 데이터가 담기게 됩니다.
데이터 버퍼에 데이터를 담는 방법은 아래와 같이 구현하였습니다.
1
|
mDataBuffer <<data<< std::endl; //버퍼에 데이터를 저장한다.
|
cs |
그리고 데이터 버퍼초기화 하는 방법은 아래와 같이 구현 하였습니다.
여기서 가장 중요한점은 ostringstream 안에 clear함수가 있는데요 이 clear를 한다고해서 데이터가 초기화 되지는
않습니다. 그래서 아래 처럼 데이터안의 내용을 공백문자로 초기화를 해주었습니다.
1
2
3
|
mDataBuffer.str("");//버퍼에 담긴 내용을 초기화 해준다.
mDataBuffer.clear();//clear함수만 사용해서는 버퍼의 내용이 초기화가 안된다.
|
cs |
그리고 이 데이터 버퍼안에 1초에 한번씩 데이터를 담을수 있도록 thread를 만들어서 1초에 한번씩 데이터를 담도록
구현을 했습니다. thread를 이용해서 1초에 한번씩 데이터를 담도록 하는 부분은 아래처럼 구현하였습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
std::thread sendDataBuffer([&]() {//새로운 쓰레드를 만들어서 1초에 한번씩 쓰레드를 돌린다.
std::cout << "sendDataBuffer "<<std::endl;
bool loop = true;
while(loop){
std::string strValue;
mNum++;
for(int i = 0; i < mNum; i++)
{
strValue += std::to_string(i);//데이터를 1부터 추가되는 숫자까지 모두 변수에 넣어둔다.
if(i != mNum - 1){
strValue += ",";
}
std::cout << "strValue:" << strValue <<std::endl;
}
saveDataBuffer(strValue.c_str());//변수에 담은 내용을 데이터 버퍼에 담는다.
if (true == loop) {
sleep(1); // 1second
}
}
});
sendDataBuffer.detach();
|
cs |
위의 구현 내용은 1초에 한번씩 숫자가 추가가 되고 0에서 부터 추가된 숫자까지 숫자를 나열해서 string 변수에
넣어주고 이값들을 1초에 한번씩 데이터 버퍼에 저장하도록 구현한 내용입니다.
그리고 파일에 저장하는 내용은 아래와 같이 구현을 하였습니다.
1
2
3
4
5
6
|
mFile.open(mFileName + mFileFormat);
mDataBuffer <<data<< std::endl; // save data buffer
mFile << mDataBuffer.str();//데이터 버퍼에 담은 내용을 파일에 저장한다.
mFile.close();
|
cs |
파일을 생성하거나 이미 있는 파일을 열어주고 이안에 데이터 버퍼에 담은 내용들을 저장하고 파일을 닫는 방식으로
구현을 하였습니다.
여기까지 데이터 버퍼에 데이터를 저장하고 파일에 담는내용까지 다루어보았는데요
이러한 내용은 실무에서도 많이 사용하는 내용이기 때문에 잘익혀두고 사용하시면 유익한 내용이 될 것입니다.
여기 까지 읽어주셔서 감사합니다!!
'C++ > C++심화' 카테고리의 다른 글
[C++]21. C++ unsigned char 포인터 형변환하기(unsigned char* to string) (0) | 2020.10.24 |
---|---|
[C++]20. C++ 파일크기 구하기 (0) | 2020.07.11 |
[C++]18. C++에서 파일의 존재 여부 확인 하기 (0) | 2020.04.15 |
[C++]17. string 데이터를 int형 데이터로 변경하는 방법(string to int) (0) | 2020.04.11 |
[C++]16. int형 데이터를 string 형 데이터로 변경(int to string) (0) | 2020.04.11 |