#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main (){
int numberToGuess, userGuess;
srand(time(NULL));
numberToGuess = rand() % 100+1;
do {
printf("1~100까지 사이의 숫자를 맞춰보세요 : ");
scanf("%d", &userGuess);
if (userGuess > numberToGuess){
printf("더 작은수를 입력하세요\n");
}
else if (userGuess < numberToGuess){
printf("더 큰수를 입력하세요\n");
}
else{
printf("정답입니다.\n");
}
} while(userGuess != numberToGuess);
return 0;
}
이름을 입력하세요 : (종료는 q) : 앵보
나이를 입력하세요 : 28
파일에 문자를 성공적으로 기록했습니다.
이름을 입력하세요 : (종료는 q) : q
#include <stdio.h>
#include <string.h>
#pragma pack(push, 1)
struct Data{
char name[20];
int age;
char address[100];
};
int main(){
struct Data d1;
FILE *fp =fopen("data2.bin", "rb");
fread(&d1, sizeof(d1), 1, fp);
printf("이름 : %s\n", d1.name);
printf("나이 : %d\n", d1.age);
printf("주소 : %s\n", d1.address);
fclose(fp);
}
이름 : 앵보
나이 : 28
주소 : 광주광역시 광산구 월계동
#include <stdio.h>
int main(){
int d, e, f;
char order;
printf("두 개의 정수와 연산자를 입력하세요 : ");
scanf("%d %d %c", &d, &e, &order);
if (order == '+'){
f = d + e;
}
else if (order == '-'){
f = d - e;
}
else if (order == '*'){
f = d * e;
}
else if (order == '/'){
f = d / e;
}
printf("결과값은 : %d 입니다.", f);
return 0;
}
두 개의 정수와 연산자를 입력하세요 : 10 10
결과값은 : 1 입니다.
#include <stdio.h>
int main(){
char name[20];
char phone[20];
char address[20];
printf("이름을 입력하세요 : ");
scanf("%s", name);
printf("전화번호를 입력하세요 : ");
scanf("%s", phone);
printf("주소를 입력하세요 : ");
scanf("%s", address);
FILE *fp = fopen("addressbook.txt", "w");
fprintf(fp, "%s %s %s", name, phone, address);
fclose(fp);
printf("파일에 문자를 성공적으로 기록했습니다.");
return 0;
}
이름을 입력하세요 : sim
전화번호를 입력하세요 : 010-4812-1598
주소를 입력하세요 : Gwangju
파일에 문자를 성공적으로 기록했습니다.
#include <stdio.h>
#include <string.h>
#pragma pack(push, 1)
struct phone_book{
char name[20];
char phone[20];
char address[20];
};
#pragma pack(pop)
int main()
{
struct phone_book d1;
FILE *fp = fopen("addressbook.txt", "r");
fscanf(fp, "%s %s %s", d1.name, d1.phone, d1.address);
fclose(fp);
printf("name : %s\n", d1.name);
printf("phone : %s\n", d1.phone);
printf("address : %s\n", d1.address);
return 0;
}
name : sim
phone : 010-4812-1598
address : Gwangju
파일 열기
파일 읽기/쓰기를 하기 전에는 fopen 함수로 파일을 열어야 합니다. 파일 열기에 성공하면 파일 포인터(FILE *)를 반환하고, 실패하면 NULL을 반환합니다.
FILE *fp = fopen(파일명, 파일모드); // 파일 열기
파일 닫기
파일 읽기/쓰기 작업이 끝났다면 반드시 fclose 함수로 파일 포인터를 닫아줍니다. 파일 포인터를 닫지 않으면 메모리 누수 현상이 발생합니다.
fclose(파일포인터); // 파일 포인터 닫기
파일 모드
파일을 열 때는 용도에 따라 다양한 파일 모드를 지정해야 합니다.
▼ 표 파일 모드
"r" | 읽기 전용 | 파일을 읽기 전용으로 엽니다. 단, 파일이 반드시 있어야 합니다. |
"w" | 쓰기 전용 | 새 파일을 생성합니다. 만약 파일이 있으면 내용을 덮어씁니다. |
"a" | 추가 | 파일을 열어 파일 끝에 값을 이어 씁니다. 만약 파일이 없으면 파일을 생성합니다. |
"r+" | 읽기/쓰기 | 파일을 읽기/쓰기용으로 엽니다. 단, 파일이 반드시 있어야 하며 파일이 없으면 NULL을 반환합니다. |
"w+" | 읽기/쓰기 | 파일을 읽기/쓰기용으로 엽니다. 파일이 없으면 파일을 생성하고, 파일이 있으면 내용을 덮어씁니다. |
"a+" | 추가(읽기/쓰기) | 파일을 열어 파일 끝에 값을 이어 씁니다. 만약 파일이 없으면 파일을 생성합니다. 읽기는 파일의 모든 구간에서 가능하지만, 쓰기는 파일의 끝에서만 가능합니다. |
t | 텍스트 모드 | 파일을 읽거나 쓸 때 개행문자 \n와 \r\n을 서로 변환합니다. ^Z를 파일의 끝으로 인식하므로 ^Z까지만 파일을 읽습니다(^Z는 Ctrl+Z 입력을 뜻합니다). |
b | 바이너리 모드 | 파일의 내용을 그대로 읽고, 값을 그대로 씁니다. |
서식을 지정하여 파일에 문자열 쓰기
fprintf 함수를 사용하면 서식을 지정하여 파일에 문자열을 쓸 수 있습니다.
// 서식을 지정하여 파일에 문자열 쓰기
fprintf(파일포인터, 서식, 값1, 값2, ...);
서식을 지정하여 파일에서 문자열 읽기
fscanf 함수를 사용하면 서식을 지정하여 파일에서 문자열을 읽을 수 있습니다.
// 서식을 지정하여 파일에서 문자열 읽기
fscanf(파일포인터, 서식, 변수의주소1, 변수의주소2, ...);
파일에 데이터 쓰기
fwrite 함수를 사용하면 파일에 데이터를 쓸 수 있습니다. 버퍼는 파일에 쓸 내용을 뜻하며 포인터(메모리 주소)를 넣어줍다. fwrite 함수는 쓰기에 성공하면 성공한 쓰기 횟수가 반환됩니다. 여기서 성공은 쓰기 크기에 지정한 크기만큼 썼느냐를 기준으로 합니다.
// 파일에 데이터 쓰기
fwrite(버퍼, 쓰기크기, 쓰기횟수, 파일포인터);
파일에서 데이터 읽기
fread 함수를 사용하면 파일에서 데이터를 읽을 수 있습니다. 버퍼는 파일의 내용을 읽어서 저장할 공간을 뜻하며 포인터를 넣어줍니다. fread 함수는 읽기에 성공하면 성공한 읽기 횟수가 반환됩니다. 여기서 성공은 읽기 크기에 지정한 크기만큼 읽었느냐를 기준으로 합니다.
// 파일에서 데이터 읽기
fread(버퍼, 읽기크기, 읽기횟수, 파일포인터);
fread 함수로 파일에서 문자열이나 구조체를 읽을 때 반드시 버퍼를 0으로 초기화 해줍니다. 버퍼를 초기화하지 않으면 이전에 메모리에서 사용하던 값이 남아있게 됩니다. 따라서 NULL이 없어서 문자열의 끝을 찾을 수 없거나 구조체의 멤버에 의도치 않은 값이 들어갈 수 있으므로 주의해야 합니다.
파일에 문자열 쓰기
fputs, fwrite 함수를 사용하면 파일에 문자열을 쓸 수 있습니다. fwrite 함수를 사용하여 파일에 문자열을 쓸 때는 쓰기 크기에 문자열의 길이를 구해서 넣어줍니다.
// 파일에서 문자열 쓰기
fputs(문자배열, 파일포인터);
fputs(문자열포인터, 파일포인터);
fwrite(문자배열, strlen(문자배열), 1, 파일포인터);
fwrite(문자열포인터, strlen(문자열포인터), 1, 파일포인터);
파일에서 문자열 읽기
fgets, fread 함수를 사용하면 파일에서 문자열을 읽을 수 있습니다. fgets 함수는 지정된 버퍼 크기만큼 문자열을 읽습니다. 만약 파일에 \n이 있으면 \n까지 문자열을 읽습니다(\n도 포함).
// 파일에서 문자열 읽기
fgets(문자배열, 읽기크기, 파일포인터);
fgets(문자열포인터, 읽기크기, 파일포인터);
fread(문자배열, 읽기크기, 1, 파일포인터);
fread(문자열포인터, 읽기크기, 1, 파일포인터);
파일에 구조체 쓰기
파일에 구조체를 쓸 때는 쓰기 크기에 구조체의 크기를 구해서 넣어줍니다.
// 파일에서 구조체 쓰기
fwrite(&구조체변수, sizeof(struct 구조체), 1, 파일포인터);
fwrite(구조체포인터, sizeof(struct 구조체), 1, 파일포인터);
파일에서 구조체 읽기
파일에서 구조체를 읽을 때는 읽기 크기에 구조체의 크기를 구해서 넣어줍니다.
// 파일에서 구조체 읽기
fread(&구조체변수, sizeof(struct 구조체), 1, 파일포인터);
fread(구조체포인터, sizeof(struct 구조체), 1, 파일포인터);
파일 포인터의 위치 변경하기
fseek 함수는 파일 포인터를 이동시킵니다. 이후 파일 포인터를 사용하는 함수들은 파일 포인터가 위치한 부분부터 읽고 쓰게 됩니다.
fseek(파일포인터, 이동할크기, 기준점);
▼ 표 fseek 함수의 기준점 종류
SEEK_SET | 파일의 처음부터 이동을 시작 | fseek(fp, 0, SEEK_SET); // 파일포인터를 파일의 처음으로 이동시킴 |
SEEK_CUR | 현재 위치부터 이동을 시작 | fseek(fp,-10, SEEK_CUR); // 파일 포인터를 현재 위치에서 10바이트만큼 역방향으로 이동시킴(-10)이 음수이므로 |
SEEK_END | 파일의 끝부터 이동을 시작 | fseek(fp, 0, SEEK_END);// 파일 포인터를 파일의 끝으로 이동시킴 |
특히 fread, fwrite 함수는 읽기/쓰기 크기와 횟수를 함께 지정하므로 파일 포인터도 읽고 쓴 크기 * 횟수만큼 전진하게 됩니다.
파일 포인터의 역방향,순방향 이동
파일의 끝 방향으로 이동하는 것을 순방향으로 이동(전진, forward)라고 하고, 파일의 처음 방향으로 이동하는 것을 역방향으로 이동(후진, forward)라고 합니다.
파일 포인터의 현재 위치 얻기
ftell 함수는 파일 포인터의 현재 위치(읽기/쓰기 위치)를 반환합니다.
long pos = ftell(파일포인터);
파일 포인터가 파일의 끝인지 검사하기
feof 함수를 사용하면 파일 포인터가 파일의 끝인지 검사할 수 있습니다. 파일 포인터가 끝이면 1을 반환하고 끝이 아니면 0을 반환합니다.
int eof = feof(파일포인터);
파일의 처음으로 되돌아가기
rewind 함수를 사용하면 파일 포인터를 파일의 처음으로 이동시킬 수 있습니다.
rewind(파일포인터);
파일의 크기 구하기
fseek 함수에 SEEK_END를 지정하여 파일 포인터를 파일의 끝으로 이동시킨 뒤 ftell 함수를 사용하면 파일의 크기를 구할 수 있습니다.
// 파일의 크기 구하기
fseek(fp, 0, SEEK_END); // 파일 포인터를 파일의 끝으로 이동시킴
long size = ftell(fp); // 파일 포인터의 현재 위치를 얻음
'c언어' 카테고리의 다른 글
C언어(숫자 맞추기 게임)_2024-05-14 (0) | 2024.06.03 |
---|---|
c언어(함수 포인터)_2024-05-20 (0) | 2024.05.20 |
c언어(구조체와 배열)_2024-05-17 (0) | 2024.05.17 |
c언어(포인터와 배열)_2024-05-16 (0) | 2024.05.16 |
c언어(switch 조건문)_2024-05-14 (0) | 2024.05.14 |