일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- nestjs auth
- 알고리즘
- C++
- git
- 카카오 코테
- OpenCV
- TypeORM
- 가상면접사례로배우는대규모시스템설계기초
- 해시
- Spring
- nestjs typeorm
- 스프링
- AWS
- spring boot
- 시스템호출
- @Autowired
- 카카오 알고리즘
- Nodejs
- nestJS
- 파이썬
- 코테
- 프로그래머스
- thymeleaf
- 카카오
- 구조체배열
- 코딩테스트
- @Component
- 컴포넌트스캔
- C언어
- python
Archives
- Today
- Total
공부 기록장 💻
명품 C++ Programming 12장 실습 문제 - 텍스트/바이너리 파일 I/O 본문
명품 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
반응형
'# Language & Tools > C++' 카테고리의 다른 글
[C++] 연산자 함수에서 참조 리턴 (연산자 함수 중복 정의 - 삽입 >> 연산자와 이항 += 연산자) (0) | 2021.06.09 |
---|---|
[C++] 챕터별 정리 (0) | 2021.06.07 |
[C++] 파일 입출력 (File I/O) - 텍스트/바이너리 파일 I/O, 파일 모드, 임의 접근, 파일 포인터 (0) | 2021.06.02 |
명품 C++ Programming 11장 실습 문제 - istream, ostream, cin.ignore(), cin.get(), 포맷 출력, 조작자, 포맷 함수, 사용자 정의 >> << 연산자 (0) | 2021.06.01 |
[C++] 명품 C++ Programming 9장 실습 문제 (0) | 2021.06.01 |
Comments