26. File
26 Sep 2019 | C++
Parsing text in files
- parsing means 다이아몬드가 많이 나오는 위치로 이동을 일단 한 후에 돌을 많이 캔다음에 다이아몬드만 쏙쏙 뽑아서 보석으로 가공하는 과정
#include <iostream>
#include <fstream>
#include <sstream>
//sstream is <string stream>
using namespace std;
int main() {
string filename = "stats.txt";
ifstream input;
input.open(filename);
if(!input.is_open()) {
return 1;
}
while(input) {
string line;
getline(input, line, ':');
// to create singe code by ':'
// indivisual data/
// so "line" variable get before ':' value.
//population is the after ':' variable.
int population;
input >> population; // to give input int value to population
input.get(); // this is for white space, whatever white space they read, but in c++ 11, use we can read white space.
input >> ws;
// ws is that Extracts and dsicards characters from the stream as long as the
// next available character is a whitespace or unitil there are no more characters available.
// white space is a term that refer to characters that are used for formatting purpose.
// In C++, this refres primarily to spaces, tabs and newlines.
// the C++ compiler generally ignores whitespace.
if(!input) {
break;
}
cout << "'" << line << "'" << " -- '" << population << "'" << endl;
}
input.close();
return 0;
}
Result
Reading and writing binary files
- Class 나 structor 에서 , instance가 list 로 되어있으면 &(reference)를 사용하여 address를 가르쳐 줘야한다.
- 또한 받는 밸류 값에 대한 instance가 list 형 식이면 받는 형식은 포인터를 지정하여 address 주소에 대한 밸류를 가르킨다.
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct Data {
char name[100];
int age;
double height;
};
int main() {
string filename = "data.bin";
// now we can open
Data data = { "Pixie", 120, 0.8 };
/*
data.name = "Pixie";
data.age = 120;
data.height = 0.8;
*/
/* write binary file*/
ofstream output;
output.open(filename);
// bitwise , bit operator
if (!output.is_open()) {
cout << "Could not create " << filename << endl;
}
output.write((char *) &data, sizeof(data)); // data을 저장한다.
// pointing some data.
// &data <- becuase the data is in list, so need to tell them data address
// and (char *) <- it is pointer to data address for real value.
// sizeof() <- in here the maens how many data we will recieve.
if (!output) {
cout << "Could not write data to file " << filename << endl;
}
output.close();
/* Read binary file*/
ifstream input;
input.open(filename);
if (!input.is_open()) {
cout << "Could not read " << filename << endl;
}
Data inputData;
// 읽어드릴데이터의 함수
input.read((char *) &inputData, sizeof(data)); // input data에 데이터 값을 콜해준다.
if (!input) {
cout << "Could not read data from file " << filename << endl;
}
input.close();
cout << inputData.name << ": " << inputData.age << ": " << inputData.height << endl;
return 0;
}
Reading Text file
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main() {
string inFileName = "test.txt";
ifstream inFile;
//ifsttream is the ios::in like only read the file.
inFile.open(inFileName);
if (inFile.is_open()) {
string line;
while (inFile) {
getline(inFile, line);
cout << line << endl;
}
// getline(infile,line) means that get line from infile file one line by one line
inFile.close();
} else {
cout << "Cannot open file: " << inFileName << endl;
}
return 0;
}
Binary files
- pragma pack(push,1)
- 변수 선언의 순서가 바껴도 구조체의 크기를 그대로로 하는 것
- pragma pack(1)에서 1은 1바이트 단위로 저장하겠다는 것.
- 예를 들어 Person, Person1 구조체가 같아 내용은 같으나 크기가 다르다.
- 그렇다면 왜 모두 1 바이트로 해서 메모리의 낭비가 없도록 하지 않는 걸까.
- 32비트 cpu에서는 4(32비트)의 단위로 데이터를 처리하는 것이 가장 빠르기 때문이다.
- 즉 #pragma pack(1)이라고 선언해놓고 원래대로 돌려놓지 않는다면 속도저하의 문제가 생길 수 있다.
- 따라서 위의 소스에서 구조체 선언이 끝나는 부분에 #pragma pack(4)라고 선언해 줘야 할 것이다.
- 하지만, 여기에도 문제가 있다. 만약 이 소스를 32비트의 PC가 아닌 다른 CPU가 장착된 장비에서 컴파일하게 된다면 어떻게 될 것인가.
- 그런 문제를 해결해주기 위해 C++ 기술인 #pragma pack(push, 1)
- #pragma pack(pop)
- 기존의 바이트를 스택에 push(padding 충전제) 하고 1바이트 단위로 처리한 다음 끝나는 부분에 원래 바이트 단위를 pop해주는 코드이다 .
#include <iostream>
#include <fstream>
using namespace std;
// #<- call the library function.
#pragma pack(push, 1)
// 변수 선언의 순서가 바껴도 구조체의 크기를 그대로로 하는 것
// pragma pack(1)에서 1은 1바이트 단위로 저장하겠다는 것.
// 예를 들어 Person, Person1 구조체가 같아 내용은 같으나 크기가 다르다.
// 그렇다면 왜 모두 1 바이트로 해서 메모리의 낭비가 없도록 하지 않는 걸까.
// 32비트 cpu에서는 4(32비트)의 단위로 데이터를 처리하는 것이 가장 빠르기 때문이다.
// 즉 #pragma pack(1)이라고 선언해놓고 원래대로 돌려놓지 않는다면 속도저하의 문제가 생길 수 있다.
// 따라서 위의 소스에서 구조체 선언이 끝나는 부분에 #pragma pack(4)라고 선언해 줘야 할 것이다.
// 하지만, 여기에도 문제가 있다. 만약 이 소스를 32비트의 PC가 아닌 다른 CPU가 장착된 장비에서 컴파일하게 된다면 어떻게 될 것인가.
// 그런 문제를 해결해주기 위해 C++ 기술인 #pragma pack(push, 1)
// #pragma pack(pop)
// 기존의 바이트를 스택에 push(padding 충전제) 하고 1바이트 단위로 처리한 다음 끝나는 부분에 원래 바이트 단위를 pop해주는 코드이다 .
// data pack(padding 쌓아 놓기 alignment)
struct Person {
char name[50];
int age;
double weight;
};
#pragma pack(pop)
int main() {
cout << sizeof(Person) << endl;
return 0;
}
writing Text file
#include <iostream>
#include <fstream>
#include <string>
//fstream is the file stream
//we can read and write
using namespace std;
int main() {
// ofstream outFile;
// this is one kind of convenience class
// and it sort of means the same ofstream means that outputstream
string filename = "text.txt";
fstream file;
//string outputFileName = "text.txt";
file.open(filename, ios::out | ios::binary);
//outFile.open(outputFileName, ios::out);
//ios::out means that writing.
// so if we use fstream, instead of , we need to specify ios::out
// we can use both of them
if(file.is_open()) {
file << "Hello there" << endl;
file << 123 << endl;
file.close();
}
else {
cout << "Could not create file: " << "text.txt" << endl;
}
return 0;
}
Result
Parsing text in files
- parsing means 다이아몬드가 많이 나오는 위치로 이동을 일단 한 후에 돌을 많이 캔다음에 다이아몬드만 쏙쏙 뽑아서 보석으로 가공하는 과정
#include <iostream>
#include <fstream>
#include <sstream>
//sstream is <string stream>
using namespace std;
int main() {
string filename = "stats.txt";
ifstream input;
input.open(filename);
if(!input.is_open()) {
return 1;
}
while(input) {
string line;
getline(input, line, ':');
// to create singe code by ':'
// indivisual data/
// so "line" variable get before ':' value.
//population is the after ':' variable.
int population;
input >> population; // to give input int value to population
input.get(); // this is for white space, whatever white space they read, but in c++ 11, use we can read white space.
input >> ws;
// ws is that Extracts and dsicards characters from the stream as long as the
// next available character is a whitespace or unitil there are no more characters available.
// white space is a term that refer to characters that are used for formatting purpose.
// In C++, this refres primarily to spaces, tabs and newlines.
// the C++ compiler generally ignores whitespace.
if(!input) {
break;
}
cout << "'" << line << "'" << " -- '" << population << "'" << endl;
}
input.close();
return 0;
}
Result
Reading and writing binary files
- Class 나 structor 에서 , instance가 list 로 되어있으면 &(reference)를 사용하여 address를 가르쳐 줘야한다.
- 또한 받는 밸류 값에 대한 instance가 list 형 식이면 받는 형식은 포인터를 지정하여 address 주소에 대한 밸류를 가르킨다.
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct Data {
char name[100];
int age;
double height;
};
int main() {
string filename = "data.bin";
// now we can open
Data data = { "Pixie", 120, 0.8 };
/*
data.name = "Pixie";
data.age = 120;
data.height = 0.8;
*/
/* write binary file*/
ofstream output;
output.open(filename);
// bitwise , bit operator
if (!output.is_open()) {
cout << "Could not create " << filename << endl;
}
output.write((char *) &data, sizeof(data)); // data을 저장한다.
// pointing some data.
// &data <- becuase the data is in list, so need to tell them data address
// and (char *) <- it is pointer to data address for real value.
// sizeof() <- in here the maens how many data we will recieve.
if (!output) {
cout << "Could not write data to file " << filename << endl;
}
output.close();
/* Read binary file*/
ifstream input;
input.open(filename);
if (!input.is_open()) {
cout << "Could not read " << filename << endl;
}
Data inputData;
// 읽어드릴데이터의 함수
input.read((char *) &inputData, sizeof(data)); // input data에 데이터 값을 콜해준다.
if (!input) {
cout << "Could not read data from file " << filename << endl;
}
input.close();
cout << inputData.name << ": " << inputData.age << ": " << inputData.height << endl;
return 0;
}
Reading Text file
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main() {
string inFileName = "test.txt";
ifstream inFile;
//ifsttream is the ios::in like only read the file.
inFile.open(inFileName);
if (inFile.is_open()) {
string line;
while (inFile) {
getline(inFile, line);
cout << line << endl;
}
// getline(infile,line) means that get line from infile file one line by one line
inFile.close();
} else {
cout << "Cannot open file: " << inFileName << endl;
}
return 0;
}
Binary files
- pragma pack(push,1)
- 변수 선언의 순서가 바껴도 구조체의 크기를 그대로로 하는 것
- pragma pack(1)에서 1은 1바이트 단위로 저장하겠다는 것.
- 예를 들어 Person, Person1 구조체가 같아 내용은 같으나 크기가 다르다.
- 그렇다면 왜 모두 1 바이트로 해서 메모리의 낭비가 없도록 하지 않는 걸까.
- 32비트 cpu에서는 4(32비트)의 단위로 데이터를 처리하는 것이 가장 빠르기 때문이다.
- 즉 #pragma pack(1)이라고 선언해놓고 원래대로 돌려놓지 않는다면 속도저하의 문제가 생길 수 있다.
- 따라서 위의 소스에서 구조체 선언이 끝나는 부분에 #pragma pack(4)라고 선언해 줘야 할 것이다.
- 하지만, 여기에도 문제가 있다. 만약 이 소스를 32비트의 PC가 아닌 다른 CPU가 장착된 장비에서 컴파일하게 된다면 어떻게 될 것인가.
- 그런 문제를 해결해주기 위해 C++ 기술인 #pragma pack(push, 1)
- #pragma pack(pop)
- 기존의 바이트를 스택에 push(padding 충전제) 하고 1바이트 단위로 처리한 다음 끝나는 부분에 원래 바이트 단위를 pop해주는 코드이다 .
#include <iostream>
#include <fstream>
using namespace std;
// #<- call the library function.
#pragma pack(push, 1)
// 변수 선언의 순서가 바껴도 구조체의 크기를 그대로로 하는 것
// pragma pack(1)에서 1은 1바이트 단위로 저장하겠다는 것.
// 예를 들어 Person, Person1 구조체가 같아 내용은 같으나 크기가 다르다.
// 그렇다면 왜 모두 1 바이트로 해서 메모리의 낭비가 없도록 하지 않는 걸까.
// 32비트 cpu에서는 4(32비트)의 단위로 데이터를 처리하는 것이 가장 빠르기 때문이다.
// 즉 #pragma pack(1)이라고 선언해놓고 원래대로 돌려놓지 않는다면 속도저하의 문제가 생길 수 있다.
// 따라서 위의 소스에서 구조체 선언이 끝나는 부분에 #pragma pack(4)라고 선언해 줘야 할 것이다.
// 하지만, 여기에도 문제가 있다. 만약 이 소스를 32비트의 PC가 아닌 다른 CPU가 장착된 장비에서 컴파일하게 된다면 어떻게 될 것인가.
// 그런 문제를 해결해주기 위해 C++ 기술인 #pragma pack(push, 1)
// #pragma pack(pop)
// 기존의 바이트를 스택에 push(padding 충전제) 하고 1바이트 단위로 처리한 다음 끝나는 부분에 원래 바이트 단위를 pop해주는 코드이다 .
// data pack(padding 쌓아 놓기 alignment)
struct Person {
char name[50];
int age;
double weight;
};
#pragma pack(pop)
int main() {
cout << sizeof(Person) << endl;
return 0;
}
writing Text file
#include <iostream>
#include <fstream>
#include <string>
//fstream is the file stream
//we can read and write
using namespace std;
int main() {
// ofstream outFile;
// this is one kind of convenience class
// and it sort of means the same ofstream means that outputstream
string filename = "text.txt";
fstream file;
//string outputFileName = "text.txt";
file.open(filename, ios::out | ios::binary);
//outFile.open(outputFileName, ios::out);
//ios::out means that writing.
// so if we use fstream, instead of , we need to specify ios::out
// we can use both of them
if(file.is_open()) {
file << "Hello there" << endl;
file << 123 << endl;
file.close();
}
else {
cout << "Could not create file: " << "text.txt" << endl;
}
return 0;
}
Result
Comments