파일 읽기
2020. 6. 8. 17:09ㆍ프로그래밍/C++
한 문자씩, 한 줄씩, 한 단어씩 읽기
유효하지 않는 입력 버리기
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#include <iostream>
#include <fstream>
#include <string> // getline()
using namespace std;
int main()
{
ifstream fin;
fin.open("helloworld.txt");
// 문자 하나씩 읽기
cout << "One Character Reading >" << endl;
char character;
while (true)
{
fin.get(character);
if (fin.fail()) // eof 상태에서 읽으려고 시도하면 fail
{
break;
}
cout << character;
}
cout << endl;
fin.clear(); // error state flags 초기화
fin.seekg(0, ios_base::beg); // 입력(get) 포인터를 시작 위치로 이동
// 한 줄씩 읽기
cout << "One Line Reading >" << endl;
string line;
while (!fin.eof())
{
getline(fin, line);
cout << line << endl;
}
fin.clear();
fin.seekg(0);
// 한 단어씩 읽기
cout << "One word Reading >" << endl;
string word;
while (!fin.eof())
{
fin >> word;
//if (!fin.fail())
cout << word << ' '; // 마지막이 '\n'으로 끝나면 읽어온게 없으므로 fail
// 이전 word를 그대로 출력하는 문제
}
cout << endl << endl;
fin.clear();
fin.seekg(0);
// 숫자만 읽고 싶다! 유효하지 않는 입력 버리기
cout << "Reading Number Only >" << endl;
int number;
//#1. ignore()
while (true)
{
fin >> number;
if (fin.fail())
{
if (fin.eof())
{
break;
}
fin.clear();
fin.ignore(LLONG_MAX, ' '); // 다음 구분 문자(' ')까지 건너뛰기
// '\t' 통과 못하는 문제점이 있다.
}
else
{
cout << number << endl;
}
}
cout << endl;
fin.clear();
fin.seekg(0);
//#2. string 버리기
string trash;
while (true)
{
fin >> number;
if (!fin.fail())
{
cout << number << endl;
continue;
}
if (fin.eof())
{
break;
}
// fail인데 eof도 아닌 경우 잘못된 입력
fin.clear(); // 두 라인의 순서를 바꾸면(clear 전에 잘못된 입력을 무시하면)
fin >> trash; // failbit 때문에 무한 루프 돈다 ㅠㅠ
}
fin.close();
return 0;
}
|
cs |
1. 입력 마지막이 '\n'으로 끝나서 읽어온게 없으므로 fail, 이전 word인 9999999를 재출력한 모습
2. ignore()의 구분 문자 ' '가 등장할때가지 버리므로 321까지 버려진 모습
EOF 처리는 까다롭다!
입출력 연산이 스트림 상태 비트를 변경한다는 사실을 기억할 것
EOF를 잘못 처리하면 무한 반복을 초래
clear()를 쓸 때는 두 번 생각하자
처음부터 완벽하게 입력을 처리하는 코드를 작성하는 건 거의 불가능
테스트 빡세게 하자
훌륭한 테스트 케이스
1. 유효한 입력 뒤에 EOF
2. 유효한 입력과 뉴라인(\n) 뒤에 EOF
3. 유효하지 않은 입력 뒤에 EOF
4. 유효하지 않은 입력과 뉴라인(\n) 뒤에 EOF
5. 공백: 탭도 포함할 건가?
6. 키보드 입력과 입력 리다이렉션(redirection)을 둘 다 확인할 것
100 200 300 cmd> number.exe < numberinput.txt
출처 : 포큐아카데미 C++ 언매니지드 프로그래밍
'프로그래밍 > C++' 카테고리의 다른 글
상속 / 생성자 소멸자 호출 순서 (0) | 2020.06.11 |
---|---|
연산자 오버로딩 (0) | 2020.06.10 |
복사 생성자 (0) | 2020.06.09 |
std::string (0) | 2020.06.07 |
컴퓨터는 참조가 뭔지 알까? (0) | 2020.06.07 |