for Robot Artificial Inteligence

26. File

|

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