과제 1 - C언어 교재 학습
구조체
구조체 포인터(함수에서 구조체 포인터 매개변수로 전달받아 사용하는 법)
파일 입출력
분할 컴파일
17. 사용자 정의 자료형(구조체)
기본 사용법
#include<stdio.h>
struct student{
int num;
double grade;
}; //세미콜론은 꼭 붙여줘야 함
-> student는 구조체 자료형이 됨
int main(void){
struct student s1; //구조체 자료형 변수 s1을 선언
//구조체 멤버를 변수로 사용
s1.num = 2;
s1.grade = 2.7;
return 0;
}
-> int, double, char 처럼 자료형 선언 후 변수명 적기
구조체 포인터
#include<stdio.h>
struct student{ //구조체 선언
int num;
double grade;
};
int main(void){
struct student s1; //구조체 자료형 변수 s1을 선언
s1.num = 1; //멤버 num 변수
s1.grade = 1.5; //멤버 grade 변수
struct student* p = &s1; //구조체 포인터 p에 s1의 주소 저장
printf("%d\n", (*p).num); //구조체 포인터 역참조로 멤버 num 접근
printf("%.2lf\n", p->grade); //'->' 연산자 사용
return 0;
}
구조체 포인터 선언을 하면 포인터 변수를 구조체 변수처럼 사용할 수 있다 !
18. 파일 입출력
사용이유
대부분 데이터는 용량이 큰 보조 메모리인 hdd나 ssd에 저장하는데 이런 파일에 접근하여 내용을 저장하고, 불러들여 출력하기 위해서 사용함
기본 사용법
읽기(r), 파일이 없는 경우 NULL을 반환하므로 이 경우를 알려주는 출력문을 넣어야 함
쓰기(w), 파일이 없는 경우 생성함
#include<stdio.h>
int main(void){
FILE *fp; //파일 포인터
fp = fopen("a.txt", "r"); //읽기 전용으로 파일개방
if (fp == NULL){
printf("파일이 열리지 않습니다.\n");
return 1;
}
printf("파일이 열렸습니다.\n");
fclose(fp); //파일닫기
return 0;
}
fgets(문자열 배열, 크기, 입력방식), fputs(문자열 배열, 출력방식) 활용
입력방식과 출력방식에는
표준 입출력(stdin, stdout)을 쓸 수도 있고
파일 포인터 변수를 통해서 파일에서 입력 또는 출력을 할 수 있음
-> 범용적
#include<stdio.h>
int main(void){
FILE *fp;
char id[100];
printf("ID 입력 : "); //입력 받아 id 배열에 저장
fgets(id,sizeof(id),stdin);
fp = fopen("id.txt", "w"); //쓰기 모드로 파일 오픈
if(fp == NULL){
printf("파일 열기 실패");
return 1;
}
fputs(id,fp); //id 배열에 있는 문자열을 파일에 출력
fclose(fp); //파일닫기
fp = fopen("id.txt", "r"); //읽기 모드로 파일 오픈
if(fp == NULL){
printf("파일 열기 실패");
return 1;
}
fgets(id,sizeof(id),fp); //파일에 있는 문자열을 id 배열에 저장
fputs(id,stdout); //id 배열을 표준 출력 방식으로 출력
fclose(fp); //파일닫기
return 0;
}
fscanf(파일 포인터 변수, scanf와 같음), fprintf(파일 포인터 변수, printf와 같음) 활용
현재로써는 fgets와 fputs와 달리 파일을 통한 출력, 입력만을 하는 한정적 기능을 하는 것 같아보임
#include<stdio.h>
int main(void){
FILE *fp;
char id[100];
printf("ID 입력 : "); //입력 받아 id 배열에 저장
scanf("%s",id);
fp = fopen("id.txt", "w"); //쓰기 모드로 파일 오픈
if(fp == NULL){
printf("파일 열기 실패");
return 1;
}
fprintf(fp,"%s",id); //id 배열에 있는 문자열을 파일에 출력
fclose(fp); //파일닫기
fp = fopen("id.txt", "r"); //읽기 모드로 파일 오픈
if(fp == NULL){
printf("파일 열기 실패");
return 1;
}
fscanf(fp,"%s",id); //파일의 문자열을 입력하여 id 배열에 저장
printf("%s",id); //id 배열 출력
return 0;
}
19. 전처리와 분할 컴파일
전처리
구조체 선언 후 헤더파일로 저장(~~~.h)
typedef struct{
int num;
char name[20];
} Student;
메인파일에서 쌍따옴표("")로 헤더파일 복사
#include<stdio.h>
#include"student.h" //사용자 헤더 파일 가지고 오기
int main(void){
//~~~~
return 0;
}

위와 같은 효과를 가지고 있다고 함.
분할 컴파일
IDE(통합개발환경)의 경우 여러 .c 파일을 분할 컴파일을 제공함
그 외에는 터미널에서 직접 컴파일을 해야함
예를 들어 main.c sub.c 파일이 있다면
gcc -c main.c
gcc -c sub.c
gcc main.o sub.o -o totalmain
또는
gcc main.c sub.c -o totalmain
로 해야함.
헤더파일의 중복문제
#ifndef _POINT_H_ //매크로명이 정의되어 있지 않으면
#define _POINT_H_ //매크로명을 정의함
~
#endif //끝
위의 매크로 조건이 제일 위에 정의되어 있으면 이후 이를 참조한 헤더파일이 들어갔을 때 조건이 거짓이 되어 다시 추가되지 않는다
과제 2 - 파일입출력과 로그인 구현
member.h 헤더 파일로 분할해서, 회원정보 저장하는 구조체 구현(ID, PW 등)
main.c 파일에서
1) ID, PW 입력 >> 파일로 내보내기
2) 내보낸 텍스트 파일로 저장한 ID, PW 값을 내 소스코드로 불러와서 출력 (or ID PW 사용자 입력 후 비교 매칭)
헤더
typedef struct{
char id[20];
char password[20];
} Membership;
메인
#include<stdio.h>
#include"membership.h" // 사용자 정의 헤더
int main(void){
Membership a = {"",""};
FILE *fp;
char buffer[100];
printf("아이디 입력 : ");
fgets(a.id,sizeof(a.id),stdin);
printf("비밀번호 입력 : ");
fgets(a.password,sizeof(a.password),stdin);
fp = fopen("membership.txt", "w");
if (fp == NULL)
{
printf("파일을 만들지 못했습니다.\n");
return 1;
}
fputs(a.id, fp);
fputs(a.password, fp);
fclose(fp);
fp = fopen("membership.txt", "r");
if (fp == NULL)
{
printf("파일을 만들지 못했습니다.\n");
return 1;
}
while(fgets(buffer, sizeof(buffer),fp) != NULL){
printf("%s", buffer);
}
fclose(fp);
return 0;
}
과제 3 - (예습)TCP/IP 소켓 프로그래밍
ch. 0 사전학습
ch. 1 개요
'NETWORK > Assignment' 카테고리의 다른 글
| C Network Study4~5 (0) | 2025.08.24 |
|---|---|
| C Network Study 3 (0) | 2025.08.13 |
| C Network Study 2 (0) | 2025.08.13 |