| English | 의미 |
|---|---|
| file/faɪl/ | 파일 |
| text file/tekst faɪl/ | 텍스트 파일 |
| secondary storage/ˈsekəndəri ˈstɔːrɪdʒ/ | 보조 저장장치 |
| persistence/pəˈsɪstəns/ | 지속성 |
| end of file/end ɒv faɪl/ | 파일 끝 |
| separator/ˈsepəreɪtə/ | 구분자 |
| sequential/siːˈkwenʃl/ | 순차적 |
기억력 게임
- 1987년까지 게임 콘솔을 끄면 모든 데이터가 지워졌습니다. 모든 세션이 첫 화면에서 시작했으므로, 긴 게임은 긴 오후나 아예 없었습니다.
- *젤다의 전설(The Legend of Zelda)*은 카트리지 내부에 작은 배터리가 탑재되어 몇 백 바이트의 데이터를 유지했습니다. 홈 게임首次으로 저장(save) 할 수 있으며,中断된 지점에서 다시 이어할 수 있었습니다.
- 모든 고점(high score), 모든 문서, 모든 설정이 존재하는 이유는 동일합니다: RAM은 전원 차단 시忘记하고, **파일(file)**은 그러지 않습니다.
- 이 수업이 파일이 존재하는 이유와 pseudocode가 텍스트 파일을 줄 단위로 읽고 쓰는 방법을 설명합니다.
파일이 필요한 이유
- 변수는 RAM에 reside하여 프로그램 종료 시 사라집니다. **이차 저장장치(secondary storage)**의 **파일(file)**은 프로그램 실행 간 데이터를 **지속(persistence)**합니다.
- 파일은 한 프로그램의 출력을 다른 프로그램의 입력으로 만들어, 데이터를 **공유(shared)**할 수 있게 합니다.
- 파일은 메모리보다 더 많은 용량을 가질 수 있으며, 프로그램은 저장된 상태로부터 **재시작(restart)**할 수 있습니다.

실행结束时变量消失;文件明天依然存在
왜 프로그램은 변수에 유지하기보다 파일에 데이터를 작성합니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
RAM는 비보성(volatile)이므로 exited 시 데이터가 사라집니다. 이차 저장 장치의 파일은 실행 간에 보존됩니다.
텍스트 파일과 세 가지 모드
- **텍스트 파일(text file)**은 문자들의 줄로 데이터를 저장하며, 프로그램은 시작부터 줄 단위로 읽고 씁니다. 이 줄의 서열이 루프를 통해 처리하게 합니다.
OPENFILE … FOR READ은 첫 번째 줄을 읽습니다.FOR WRITE은 새 파일을 생성하거나 기존 파일을 위저라이트합니다.FOR APPEND은 기존 내용을 유지한 채 끝에 새로운 줄을 추가합니다.- 사용 전에 열고,使用后关闭。파일은 동시에 하나의 모드만 가집니다.
각 파일 열기 모드를 그에 해당하는 기능과 매칭하십시오.
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
READ는 읽기; WRITE는 처음부터 덮어씌우기; APPEND는 Existing content를 잃지 않고 끝에 추가합니다.
기존 파일의 내용을 잃지 않고末尾에 줄을 추가하려면, 이를 ____ 모드로 엽니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
WRITE는 파일을 비운 상태로 시작합니다. APPEND는 기존 내용을 유지하고 그 뒤에 씁니다.
모든 줄 읽기
OPENFILE "data.txt" FOR READ
WHILE NOT EOF("data.txt") DO
READFILE "data.txt", LineString
OUTPUT LineString
ENDWHILE
CLOSEFILE "data.txt"
EOF는 **파일 끝(end of file)**을 테스트합니다. 각 읽기 전에 테스트하십시오: 끝을 넘어 읽기는 오류입니다.CLOSEFILE가 중요합니다: 버퍼링된 데이터가 손실되거나 다른 프로그램이 열린 파일을 접근할 수 없게 됩니다.
파일 처리: 열기 → 사용 → 닫기
모든 파일이 따르는 수명 주기를 단계별로 살펴보십시오. 루프 중 읽기 시 EOF를 테스트하고, 항상 마지막에 닫는 것 등 두 가지는 자주 잊어버립니다.
EOF는 무엇을 테스트합니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
EOF(파일 끝)는 각 읽기 전에 체크되어 데이터가 없을 때 루프가 멈춥니다.
사용 후 왜 항상 파일을 닫아야 합니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
닫기는 버퍼된 쓰기를 디스크에 저장하고 잠금을 해제하여 다른 프로그램이 파일을 사용할 수 있게 합니다.
줄 쓰기
OPENFILE "log.txt" FOR WRITE
FOR i ← 1 TO 100
WRITEFILE "log.txt", "Event " & NUM_TO_STR(i)
NEXT i
CLOSEFILE "log.txt"
WRITE는 파일을 비우기开始합니다.历史记录必须保留的日志에 추가하려면, 대신FOR APPEND로 엽니다.- 텍스트 파일은 **문자열(strings)**을 보관합니다: 숫자는出去时
NUM_TO_STR로 변환됩니다.
worked example: 파일의 마지막 세 줄
- 텍스트 파일의 마지막 세 줄을 순서대로 출력하는 procedures
LastLines(FileName)를 작성하십시오.
PROCEDURE LastLines(BYVAL FileName : STRING)
DECLARE LineX, LineY, LineZ : STRING
LineX ← ""
LineY ← ""
LineZ ← ""
OPENFILE FileName FOR READ
WHILE NOT EOF(FileName) DO
LineX ← LineY
LineY ← LineZ
READFILE FileName, LineZ
ENDWHILE
CLOSEFILE FileName
OUTPUT LineX
OUTPUT LineY
OUTPUT LineZ
ENDPROCEDURE
- 매번 새로운 줄이 추가되면 이전 줄들이 밀려나므로,
EOF에서 세 변수는 마지막 세 줄을 보유합니다; 파일이 짧으면 빈 문자열이 출력됩니다. 처음 다섯 줄에 대해서는, 읽기 횟수를 세어, 5회读了 또는EOF이 도달했을 때, 먼저 발생하는 쪽에서 멈춥니다. 빈 파일인 경우, 열기 직후에EOF가 즉시 참(true)이 됩니다.
LastLines 절차의 단계를 순서대로 나열하십시오.
난이도 3/5 · 200 코인 + 오늘 첫 완료 시 소액 보너스
초기화, 열기, 읽기 전에 shift이 있는 루프, 닫기, 출력. 읽기 이후에 shift하면 최신 줄을 잃습니다.
줄의 필드(fields)
- 레코드는 **한 줄(one line)**로 쓰이며, 필드는 구분자(separator) 문자로 연결됩니다. 각 숫자나 부울 값은
NUM_TO_STR로 변환(そしてSTR_TO_NUM로 다시 읽거나,"TRUE"와 비교하여)됩니다. - 데이터에 절대 나타날 수 없는 구분자를 선택합니다: 이름과 숫자에는 쉼표나
|을 사용하되, 이름에 공백이 포함될 수 있다면 공백은 절대 사용하지 않습니다. - 다시 읽기: 줄을 읽고 구분자에서 분리하며, 각 필드의 유형으로 변환하여 레코드에 저장합니다.

쓰기는 구분자로 연결하고, 읽기는 분리하여 유형으로 변환합니다
줄은 플레이어의 성명과 점수를 저장합니다. 가장 안전한 구분자(separator)는 무엇입니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
구분자는 필드 내부에 절대 포함되어서는 안 됩니다. 성명은 공백을 포함하고, 점수는 숫자를 포함합니다.
INTEGER는 텍스트 파일에 직접 쓸 수 있으며, 먼저 문자열로 변환할 필요가 없습니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
텍스트 파일은 문자 줄을 저장합니다. NUM_TO_STR로 변환하여 쓰고, STR_TO_NUM으로 다시 읽습니다.
worked example: 레코드 저장 및 다시 불러오기
- 레코드
Player에는 필드Name : STRING과Score : INTEGER이 있습니다. 이를scores.txt에 한 줄로 추가하는 가상 코드(pseudocode)를 작성하고, 한 줄을 다시 레코드에 읽어들이는 가상 코드를 작성하십시오.
OPENFILE "scores.txt" FOR APPEND
WRITEFILE "scores.txt", Player.Name & "," & NUM_TO_STR(Player.Score)
CLOSEFILE "scores.txt"
OPENFILE "scores.txt" FOR READ
READFILE "scores.txt", Line
Pos ← POSITION(Line, ",")
Player.Name ← LEFT(Line, Pos - 1)
Player.Score ← STR_TO_NUM(MID(Line, Pos + 1, LENGTH(Line) - Pos))
CLOSEFILE "scores.txt"
- 채점 기준: 올바른 모드, 양방향 숫자 변환, 이름에将出现할 수 없는 구분자, 그리고 두 파일 모두를 닫음.
레코드를 텍스트 파일의 한 줄로 저장하려면, 프로그램이 다음 중 모든 것을 수행해야 합니다:
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
변환, 결합, 쓰기, 닫기. 텍스트 파일에는 바이너리 레이아웃이 없으며, 그것은 바이너리 파일이 하는 일입니다.
직렬 및 직접 접근
- 텍스트 파일은 직렬(순차)입니다: 시작점에서 순서대로 읽으므로 특정 줄을 찾으려면 그 이전의 모든 줄을 읽어야 합니다.
- 직접(무작위) 접근은 다른 줄을 읽지 않고 계산된 위치로 바로 레코드에 도달할 수 있습니다. 이는 고정 길이 레코드가 필요하므로 텍스트 파일에는 적용되지 않습니다.
- 교육 과정에서는 위의 텍스트 파일 루프가 표준 모델입니다: 열고,
EOF를 테스트하고, 읽고, 닫습니다.
직접(무작위) 접근(direct access)은 다른 것을 먼저 읽지 않고도 바로 레코드에 점프할 수 있게 합니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
시리즈 접근(serial access)은 시작점에서부터 읽어야 합니다.
놓칠 수 있는 점
- 끝을 넘어 읽음. Test
EOFbefore everyREADFILE. - 파일의 내용을 유지해야 할 때
FOR WRITE를 엽니다. 이것이APPEND입니다. NUM_TO_STR없이 숫자를 쓰거나,STR_TO_NUM없이 다시 읽기. 텍스트 파일은 문자열만 저장합니다.CLOSEFILE를 잊거나,OPENFILE전에 파일을 사용합니다. 둘 다 파일 처리 점수를 잃게 됩니다.
이해했습니다
- 파일은 지속성(persistence) 을 제공합니다: 프로그램 종료 후에도 데이터가 보존되며, 공유 가능하며, 메모리 용량을 초과할 수 있습니다.
OPENFILE … FOR READ | WRITE | APPEND→READFILE/WRITEFILE→CLOSEFILE;WRITE는 덮어 쓰고,APPEND는末尾에 추가합니다- 각 읽기 전에
EOF를 테스트하고,NUM_TO_STR로 변환하여城外로 보내고STR_TO_NUM로 다시城内로 가져옵니다 - 한 레코드 = 한 줄, 데이터에 절대出现하지 않는 구분자로 필드를 연결합니다