흔한 생활/잡다한 공부
[C언어] 든든한 C 프로그래밍 3판 12장 연습문제 답 풀이
흔한 학생
2023. 7. 11. 16:44
12장 Quiz (빈칸채우기)
데이터가 입력될 때마다 구조체 변수에 저장하여 파일에 추가
입력이 종료되면 파일의 데이터를 처음부터 끝까지 출력
성명이 end면 반복 종료
fwrite() 로 입력된 emp변수 내용을 fp에 저장(기존 파일에 내용 추가)
fopen() 추가모드로 파일 열기
fread() fp에서 읽어 구조체 변수에 저장
구조체 변수 emp 출력
fread()실패하면 반복 탈출, 성공하면 세 번째 인자 반환?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#pragma warning(disable:4996)
struct EMP {
char name[20];
char telno[20];
int salary;
};
int main()
{
FILE* fp;
struct EMP emp;
int i;
if ((fp = fopen("DATA5.dat", "ab")) == NULL)
{
printf("file open error. \n");
exit(1);
}
while (1)
{
printf("\n성명 ? (입력종료:end) ");
gets(emp.name);
if (!strcmp(emp.name, "end"))
break;
printf("월급 ? ");
scanf("%d%*c", &emp.salary);
printf("전화번호 ? ");
gets(emp.telno);
//코드추가
fwrite(&emp, sizeof(emp), 1, fp); //파일 저장
}
fp = freopen("DATA5.dat", "rb", fp);
printf("\n데이터 파일 Load \n");
while (1)
{
//코드추가
if (fread(&emp, sizeof(emp), 1, fp) != 1)
break;
printf("%s, %s, %d \n", emp.name, emp.telno, emp.salary);
}
fclose(fp);
return 0;
}
답
"ab"
&emp, sizeof(emp), 1, fp
fread(&emp,sizeof(emp),1,fp)!=1
[12-2]
ex01.dat 파일을 write 모드로 open
A부터 순서대로 26개의 문자가 저장되므로 정답은 1번이다.
[12-3]
2번 이진 모드이지만 fscanf를 사용하였다.
[12-3]
[12-3]
[12-6]
텍스트 파일을 문자열 단위로 읽어 표준 출력에 출력시키는 프로그램
문자열은 한 행 기준 80 문자 단위로 읽어 출력
fgets() 함수 사용
fgets() 함수 실패 시 중단
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)
int main()
{
char ch[80];
FILE* fp;
fp = fopen("ex06.dat", "r");
while (fgets(ch, 80, fp))
printf("%s\n", ch);
fclose(fp);
return 0;
}
혹은
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE* fp;
char line[81]; // 문자열을 저장할 배열
fp = fopen("text.txt", "r");
if (fp == NULL) {
printf("파일을 열 수 없습니다.\n");
exit(1);
}
while (fgets(line, sizeof(line), fp) != NULL) {
printf("%s", line);
}
fclose(fp);
return 0;
}
(
왜 안되지...'
알고보니 텍스트 파일 인코딩 방식 문제였나 암튼 바꾸니까 됨
다른 코드 짤땐 열렸는데 아몰라
까꿍이 서울시 강남구 역삼동 100 0234290001
진달래 서울시 성동구 옥수동 200 0222940002
개나리 속초시 대포동 바다 1번지 0612210003
[12-7]
이미 작성된 텍스트 파일을 문자열 단위로 읽어 표준 출력에 출력시키는 프로그램
성명, 나이, 월급, 전화번호 저장
읽기 위해 fscanf() 사용
fscanf() 함수가 실패할 경우 읽기 중단
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)
struct list {
char name[20];
int age, sal;
char num[20];
};
int main()
{
struct list man[3];
int i;
FILE* fp;
fp = fopen("DATA1.txt", "rt");
while(
fscanf(fp, "%s %d %d %s", man->name, &man->age, &man->sal, man->num)==4)
printf("%s, %d, %d, %s\n", man->name, man->age, man->sal, man->num);
return 0;
}
출력해보니 굳이 구조체변수가 배열일 필요가 없다
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)
struct list {
char name[20];
int age, sal;
char num[20];
};
int main()
{
struct list man;
FILE* fp;
fp = fopen("DATA1.txt", "rt");
while(
fscanf(fp, "%s %d %d %s", man.name, &man.age, &man.sal, man.num)==4)
printf("%s, %d, %d, %s\n", man.name, man.age, man.sal, man.num);
return 0;
}
결과
까꿍이, 23, 1750000, 02-3429-0001
진달래, 30, 1600000, 02-2294-0002
개나리, 21, 1940000, 02-564-0003