관리 메뉴

공부 기록장 💻

명품 C++ Programming 12장 실습 문제 - 텍스트/바이너리 파일 I/O 본문

# Language & Tools/C++

명품 C++ Programming 12장 실습 문제 - 텍스트/바이너리 파일 I/O

dream_for 2021. 6. 3. 15:17

명품 C++ 프로그래밍 12장

 

1.

#include <iostream>
#include <fstream>
using namespace std;

int main(){
	fstream fin("c:\\temp\\test.txt", ios::in);
	if(!fin){
		cout<<"파일 열기 실패"<<endl;
		return 0;
	}
	int ch;
	while((ch=fin.get())!=EOF) cout.put(ch);
	fin.close();
}

 

 

2. 

#include <iostream>
#include <fstream>
using namespace std;

int main(){
	fstream fin("c:\\windows\\system.ini", ios::in);
	if(!fin){
		cout<<"파일 열기 실패"<<endl;
		return 0;
	}
	
	string line;
	int i=1;
	while(getline(fin,line))
		cout<<i++<<" : "<<line<<endl;
	fin.close();		
}

 

 

3.

#include <iostream>
#include <fstream>
using namespace std;

int main(){
	fstream fin("c:\\windows\\system.ini", ios::in);
	if(!fin){
		cout<<"파일 열기 실패"<<endl;
		return 0;
	}
	
	int ch;
	while((ch=fin.get())!=EOF)cout<<(char)toupper(ch);
	fin.close();
}

 

4.

#include <iostream>
#include <fstream>
using namespace std;

int main(){
	ifstream fin("c:\\Temp\\system.ini");
	ofstream fout("c:\\Temp\\system.txt");
	
	if(!fin||!fout){
		cout<<"파일 열기 실패"<<endl;
		return 0;
	}
	
	int ch;
	while((ch=fin.get())!=EOF) fout << (char)toupper(ch);//fout.put(toupper(ch));
	
	fin.close();
	fout.close();
}

 

 

5.

#include <iostream>
#include <fstream>
using namespace std;

int main(){
	ifstream fin("1.cpp");
	
	if(!fin){
		cout<<"파일 열기 실패"<<endl;
		return 0;
	}

	int ch;
    
	while((ch=fin.get())!=EOF){
		if(ch=='/'){
			if((ch=fin.get())=='/'){ // 또 다음 문자가 '/' 라면 주석문임을 확인하고 줄바꿈 문자 나올 때까지 무시 
				fin.ignore(100, '\n'); 
				cout<<endl; // 줄바꿈 문자까지 ignore로 인해 제거 되었으므로 다시 출력 
			}
			else cout<<"/";  // '/'문자가 아닌 경우에는 그대로 출력 
		}
		else cout.put(ch);
	}
	fin.close();
}

 

 

6. 

#include <iostream>
#include <fstream>
using namespace std;

int main(){
	ifstream fin("c:\\Temp\\system.ini", ios::in|ios::binary); // 바이너리 모드로 열기 
	ofstream fout("c:\\Temp\\system.txt", ios::in|ios::binary);
	
	if(!fin||!fout){
		cout<<"파일 열기 실패"<<endl;
		return 0;
	}
	 
	cout<<"복사 시작..."<<endl;
	// 입력 파일의 크기 구하기 - 파일의 끝으로 이동 한 후 tellg
	fin.seekg(0, ios::end); // 파일의 맨끝으로 이동하여 
	int fileSize=fin.tellg(); // 현재 get pointer의 위치의 정숫값을 fileSize에 저장(실제 파일의 바이트 크기) 
	int unit=fileSize/10; // 파일 사이즈의 10%를 unit에 저장 
	
	// 10% = n개 개수만큼 읽어 %출력
	char *buf=new char[unit]; // unit만큼 문자열 동적 생성 
	fin.seekg(0, ios::beg);
	
	for(int i=0;i<10;i++){
		fin.read(buf, unit); // unit 만큼 읽어 buf에 저장- 블록(여러 byte) 단위로 읽기
		int readCount=fin.gcount(); // 방금 읽은 바이트의 수 
		fout.write(buf, readCount); // buf 문자열의 readCount개의 문자를 fout 객체가 가리키는 파일에 저장  
		cout<<"."<<readCount<<"B "<<(i+1)*10<<"%"<<endl;
	}
	cout<<fileSize<<"B 복사 완료"<<endl;
	 
	fin.close();
	fout.close();
	delete []buf;
}

 

7.

파일의 사이즈 구하는 법: 파일의 끝으로 이동했을 때, 그 위치에 대한 tellg() 의 값

파일의 끝에서부터 거꾸로 복사하기 위해서는

fileSize-1-i 의 위치를 읽어 출력

 

#include <iostream>
#include <fstream>
using namespace std;

int main(){
	ifstream fin("c:\\Windows\\system.ini", ios::in|ios::binary);
	ofstream fout("c:\\Temp\\system.txt", ios::out|ios::binary);
	
	if(!fin||!fout){
		cout<<"파일 열기 오류"<<endl;
		return 0;
	}

	fin.seekg(0, ios::end);
	int fileSize=fin.tellg();
	
	int ch;
	for(int i=0;i<fileSize;i++){
		fin.seekg(fileSize-i-1, ios::beg); // 첫 위치로부터 fileSize-i-1만큼 위치한 곳 
		ch=fin.get();
		fout.put(ch);
	}
}

 

 

8.

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cctype>
using namespace std;

// 16진수로 출력 
void printHexa(char *buf, int n){
	for (int i=0;i<16;i++){
		cout<<setw(2)<<setfill('0')<<hex<<(int)buf[i];
		
		if(i==n-1) {	// 읽은 실제 값보다 하나 작은 경우에는 나머지값들을 공백으로 채움 
			cout<<' ';
			for(int j=i+1;j<16;j++){
				cout<<setw(2)<<setfill(' ')<<hex<<' ';
				cout<<' ';
			}
			break;
		}
		
		if(i==7) cout<<setw(4)<<setfill(' ')<<' '; // 8 - 9번째 문자 사이에는 4칸의 공백
		
		else cout<<' '; // 문자 하나 출력 후에는 공백 한 칸
	}
}


// 문자로 출력 
void printChar(char *buf, int n){
	cout << setw(4) << setfill(' ') << ' ';	// hex 라인 출력 후 띄기 위해

	for(int i=0; i<16; i++) {
		if(isprint(buf[i]))
			cout << buf[i];
		else
			cout << '.';

		if(i == n-1) {  // 읽은 값보다 i가 작다면, 나머지는 그냥 출력 x
			break;
		}
	
		if(i == 7) cout << setw(4) << setfill(' ') << ' '; // 8-9번쨰 문자 사이에는 4칸의 공백
		else cout << ' ';
	}

}

int main(){
	fstream fin("c:\\Temp\\system.ini", ios::in | ios::binary); // 파일 스트림 객체, 바이너르 모드로 입력을 위해 생성 
	if(!fin){
		cout<<"파일 열기 오류"<<endl;
		return 0;
	}
	
	char buf[16];
	while(true){
		fin.read(buf, 16); // 16바이트만큼씩 읽어서 buf에 저장
		int real = fin.gcount();
		printHexa(buf, real);
		printChar(buf, real);
		cout<<endl;
		
		if(real<16) break; // 마지막 줄 읽게 되면 while문 종료 
	} 

	fin.close();
}

 

9. 

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
 
int main(){
	fstream fin("c:\\Temp\\system.ini"); 
	if(!fin){
		cout<<"파일 열기 오류"<<endl;
		return 0;
	}
	
	vector<string> v;
	string line;
	while(getline(fin, line))v.push_back(line);
	
	int lineNum;
	cout<<"라인 번호를 입력하세요. 1보다 작은 값이면 종료 "<<endl;
	do{
		cout<<": ";
		cin>>lineNum;
		if(lineNum>v.size()) continue;
		cout<<v[lineNum-1]<<endl;
	}while(lineNum>=0);
	
	cout<<"종료합니다."<<endl; 
	
	fin.close();
}

 

 

10.

 

728x90
반응형
Comments