문제 상황
C 언어를 사용하여 파일에 저장된 일련의 데이터를 읽어 들인 후, 콘솔 화면에 열(column) 또는 표(tabular) 형태로 깔끔하게 출력하는 방법을 알아보겠습니다.
해결 방법
먼저 파일을 쓰기 모드로 열어 일련의 정보를 파일에 기록한 뒤 닫습니다. 그다음 같은 파일을 다시 읽기 모드로 열어 저장된 데이터를 콘솔에 표 형태로 출력합니다.
1. 파일을 쓰기 모드로 열기
FILE *fp;
fp = fopen("sample.txt", "w");- 파일이 존재하지 않으면 새 파일이 자동으로 생성됩니다.
- 파일이 이미 존재하면 기존 내용은 모두 지워지고 새로운 내용만 저장됩니다.
2. 파일을 읽기 모드로 열기
FILE *fp;
fp = fopen("sample.txt", "r");- 파일이 존재하지 않으면 fopen 함수는 NULL을 반환합니다.
- 파일이 존재하면 파일에서 데이터를 성공적으로 읽어올 수 있습니다.
3. 표 형태로 출력하는 핵심 로직
콘솔에 데이터를 표 형태로 보여주는 핵심 아이디어는 간단합니다. 파일에서 한 글자씩 읽으면서 쉼표(',')를 만나면 탭 문자( )로 바꿔 출력하는 것입니다. 이렇게 하면 쉼표로 구분된 데이터가 마치 표처럼 열 단위로 정렬되어 보입니다.
while ((ch = getc(fp)) != EOF) {
if (ch == ',')
printf(" ");
else
printf("%c", ch);
}전체 프로그램 코드
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
int main() {
char ch;
FILE *fp;
/* 1단계: 쓰기 모드로 파일을 열어 사용자 입력 저장 */
fp = fopen("std1.txt", "w");
printf("enter the text.press cntrl Z:
");
while ((ch = getchar()) != EOF) {
putc(ch, fp);
}
fclose(fp);
/* 2단계: 읽기 모드로 파일을 열어 표 형태로 출력 */
fp = fopen("std1.txt", "r");
printf("text on the file:
");
while ((ch = getc(fp)) != EOF) {
if (ch == ',')
printf(" ");
else
printf("%c", ch);
}
fclose(fp);
return 0;
}실행 결과
enter the text.press cntrl Z: Name,Item,Price Bhanu,1,23.4 Priya,2,45.6 ^Z text on the file: Name Item Price Bhanu 1 23.4 Priya 2 45.6
코드 설명 및 참고 사항
프로그램은 두 단계로 동작합니다. 첫 번째 단계에서는 getchar()로 사용자 입력을 한 글자씩 받아 putc() 함수로 파일(std1.txt)에 기록합니다. Windows 환경에서는 Ctrl+Z, Linux/macOS 환경에서는 Ctrl+D를 눌러 입력을 종료(EOF 발생)할 수 있습니다.
두 번째 단계에서는 파일을 다시 열어 getc()로 한 글자씩 읽으며, 쉼표를 만날 때마다 탭 두 개( )를 출력해 열 간격을 넓힙니다. 그 결과 '이름, 항목, 가격'처럼 쉼표로 구분된 데이터가 정렬된 표 형태로 화면에 나타납니다.
참고로 char형 변수에 getchar()와 getc()의 반환값을 저장하면 EOF(-1)와 일반 문자를 구분하지 못하는 문제가 발생할 수 있으므로, 실무에서는 반환값을 int형 변수에 저장하는 것이 더 안전한 코딩 습관입니다.