본문 바로가기
흔한 학교 생활/든든한 C 프로그래밍

[C언어] 든든한 C 프로그래밍 3판 12장 연습문제 답 풀이

by 흔한 학생 2023. 7. 11.
반응형

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
반응형