C์ธ์ด์ ์ ์ถ๋ ฅ๊ณผ ํ์ผ ์คํธ๋ฆผ(stream)์ ๋ํด ์์๋ณด๊ธฐ (1) (tistory.com)
ํ์ผ ์ ์ถ๋ ฅ
fopen: ํ์ผ ์ด๊ธฐ
fscanf / fgets : ํ์ผ์ฝ๊ธฐ (ํ ๋จ์ด์ฉ ์ฝ์ ๋ / ํ ์ค์ฉ ์ฝ์ ๋)
fprintf : ํ์ผ ์ฐ๊ธฐ
fclose : ํ์ผ ๋ซ๊ธฐ
1. ํ์ผ์ ๋ฐ์ดํฐ ์ฐ๊ธฐ
#include <stdio.h>
int main()
{
FILE *fp = NULL;
fp = fopen("data.txt", "w");
if(fp == NULL){
printf("Failed to open file %s\n", "data.txt");
return -1;
}
// file write
fprintf(fp, "My first data file\n");
fclose(fp);
return 0;
}
- "data.txt"๋ผ๋ ์ด๋ฆ์ ํ์ผ์ ์ฐ๊ธฐ ๋ชจ๋๋ก ์ฐ๋ค.
- "data.txt" ํ์ผ์ "My first data file"์ด๋ผ๋ ๋ฌธ์์ด์ ์์ฑํ๋ค
- ํ์ผ์ ๋ซ๋๋ค.
- ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๋ค.
2. ํ์ผ์์ ๋ฐ์ดํฐ ์ฝ๊ธฐ - ํ ๋จ์ด์ฉ
#include <stdio.h>
int main()
{
FILE *fp = NULL;
char buff[100];
fp = fopen("data.txt", "r");
if(fp == NULL){
printf("Failed to open file %s\n", "data.txt");
return -1;
}
// file read
while(fscanf(fp, "%s", buff) != EOF){
printf("%s\n", buff);
}
fclose(fp);
return 0;
}
- fopen ํจ์๋ฅผ ์ฌ์ฉํ์ฌ "data.txt"๋ผ๋ ์ด๋ฆ์ ํ์ผ์ ์ฝ๊ธฐ ๋ชจ๋("r")๋ก ์ฐ๋ค
- fscanf ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์์ ๋ฌธ์์ด์ ์ฝ์ด์จ๋ค. %s ํฌ๋งท ์ง์ ์๋ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด์ ์ฝ์ด์ด
- fscanf๊ฐ ํ์ผ์์ ๋ฌธ์์ด์ ์ฝ์ด์ค๋ฉด buff ๋ฐฐ์ด์ ์ ์ฅ๋๊ณ , EOF(End Of File ํ์ผ์ ๋)๊น์ง ๋ฐ๋ณต
- ๊ฐ ์ฝ์ด์จ ๋ฌธ์์ด์ printf๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ
- ํ์ผ์ ๋ซ๋๋ค.
- ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๋ค.
๊ฒฐ๊ณผ : data.txt์ ์ ์ด๋จ๋ "My first data file" ์ด
My
first
data
file
๋ก ์ถ๋ ฅ๋๋ค.
<fscanf ํจ์์ ๋์>
์์
FILE *fp = fopen("data.txt", "r");
int a;
float b;
fscanf(fp, "%d %f", &a, &b);
fclose(fp);
scanf: ํ์ค ์ ๋ ฅ์์ ๋ฐ์ดํฐ ์ฝ๊ธฐ. ํ์ค ์ ๋ ฅ(ํค๋ณด๋)์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ํจ์
fscanf: ํ์ผ ์คํธ๋ฆผ์์ ๋ฐ์ดํฐ ์ฝ๊ธฐ. ์ง์ ๋ ํ์ผ ์คํธ๋ฆผ์์ format ๋ฌธ์์ด์ ๋ง๋ ์ ๋ ฅ์ ์ฝ์ด์ ๋ณ์๋ค์ ์ ์ฅํจ
sscanf: ๋ฌธ์์ด์์ ๋ฐ์ดํฐ ์ฝ๊ธฐ. str์์ format ๋ฌธ์์ด์ ๋ง๋ ์ ๋ ฅ์ ์ฝ์ด์์ ๋ณ์๋ค์ ์ ์ฅ
vscanf: ๊ฐ๋ณ ์ธ์๋ฅผ ์ฌ์ฉํ๋ ํ์ค ์ ๋ ฅ ์ฝ๊ธฐ. format ๋ฌธ์์ด๊ณผ va_list ํ์ ์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ์ ์ฒ๋ฆฌ
vsscanf: ๊ฐ๋ณ ์ธ์๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์์ด ์ฝ๊ธฐ. sscanf์ ์ ์ฌํ์ง๋ง, ์ธ์ ๋ชฉ๋ก์ va_list ํ์ ์ผ๋ก ๋ฐ๋ ํจ์
vfscanf: ๊ฐ๋ณ ์ธ์๋ฅผ ์ฌ์ฉํ๋ ํ์ผ ์คํธ๋ฆผ ์ฝ๊ธฐ. fscanf์ ์ ์ฌํ์ง๋ง, ์ธ์ ๋ชฉ๋ก์ va_list ํ์ ์ผ๋ก ๋ฐ๋ ํจ์
3. ํ์ผ์์ ๋ฐ์ดํฐ ์ฝ๊ธฐ - ํ์ค
#include <stdio.h>
#define BUFF_SIZE 256
int main()
{
FILE *fp = NULL;
char buff[256];
fp = fopen("data.txt", "r");
if(fp == NULL){
printf("Failed to open file %s\n", "data.txt");
return -1;
}
// file read lines
while(fgets(buff, BUFF_SIZE, fp) != NULL){
printf("%s\n", buff);
}
fclose(fp);
return 0;
}
๊ฒฐ๊ณผ : data.txt์ ์ ์ด๋จ๋ "My first data file" ์ด
My first data file
(ํ์ค)๋ก ์ถ๋ ฅ๋๋ค.
<fgets ํจ์์ ๋์>
์์
FILE *fp = fopen("data.txt", "r");
char buffer[100];
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
fgetc: ํ์ผ ์คํธ๋ฆผ stream์์ ํ๋์ ๋ฌธ์๋ฅผ ์ฝ์ด์ด. ์ฝ์ด์จ ๋ฌธ์๋ int ํ์ ์ผ๋ก ๋ฐํ
fgets: ํ์ผ ์คํธ๋ฆผ์์ ๋ฌธ์์ด ์ฝ๊ธฐ (ํ ์ค ๋๋ ์ง์ ๋ ํฌ๊ธฐ๋งํผ). ์ ๋ ฅ๋ ๋ฌธ์์ด์ ์ค๋ฐ๊ฟ ๋ฌธ์๋ฅผ ํฌํจํ ์ ์์ผ๋ฉฐ, ์ค๋ฐ๊ฟ ๋ฌธ์๊ฐ ์์ผ๋ฉด ๊ทธ ๋ฌธ์๋ฅผ ํฌํจํ์ฌ ๋ฌธ์์ด์ ๋ฐํ
getc: ํ์ผ ์คํธ๋ฆผ์์ ๋จ์ผ ๋ฌธ์ ์ฝ๊ธฐ (ํ์ผ ํฌ์ธํฐ์ ๊ด๋ จ๋ ํจ์). fgetc์ ์ ์ฌ
getchar: ํ์ค ์ ๋ ฅ(ํค๋ณด๋)์์ ๋จ์ผ ๋ฌธ์๋ฅผ ์ฝ์ด์ค๋ ํจ์. ํ์ค ์ ๋ ฅ์์ ํ๋์ ๋ฌธ์๋ฅผ ์ฝ์ด์จ๋ค. ๋ฐํ๊ฐ์ int ํ์
ungetc: ๋ง์ง๋ง์ผ๋ก ์ฝ์ ๋ฌธ์๋ฅผ ํ์ผ ์คํธ๋ฆผ์ ๋๋๋ ค ๋๋ ํจ์. char๋ก ์ง์ ๋ ๋ฌธ์๋ฅผ ํ์ผ ์คํธ๋ฆผ stream์ ๋ค์ ๋ฃ์ด์ฃผ๋ฉฐ ์ด ๋ฌธ์๋ ๋ค์ ๋ฒ์ getc๋ fgetc๋ก ์ฝ์ ์ ์๋ค. ungetc๋ ํ์ผ ์คํธ๋ฆผ์ ํ ๋ฌธ์๋ฅผ ๋๋๋ฆฌ๋ฉฐ, ์ฐ์ํด์ ์ฌ๋ฌ ๋ฌธ์๋ฅผ ๋๋๋ฆฌ๋ ๊ฒ์ ๋ณด์ฅ๋์ง ์์
ํ์ผ ๋ชจ๋
ํ์ผ ์ ์ถ๋ ฅ ํจ์
***** ์ด์ง ๋ฐ์ดํฐ ์ถ๋ ฅํจ์๋ fwrite ์ด๋ค *****
***** ์ด์ง ๋ฐ์ดํฐ ์ ๋ ฅํจ์๋ fread ์ด๋ค *****
ํ ์คํธ ํ์ผ๊ณผ ์ด์ง ํ์ผ์ ์ฐจ์ด์
ํ ์คํธ ํ์ผ : ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์์คํค ์ฝ๋๋ก ๋ณํ๋์ด์ ์ ์ฅ๋จ
- ์ ์ฅ ๋ฐฉ์:
- ๋ฌธ์ ์ธ์ฝ๋ฉ: ํ ์คํธ ํ์ผ์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋์ด ์ฝ์ ์ ์๋ ํ์์ผ๋ก ์ ์ฅ๋จ. ์ผ๋ฐ์ ์ผ๋ก ASCII(๋ฏธ๊ตญ ํ์ค ์ฝ๋) ๋๋ UTF-8๊ณผ ๊ฐ์ ๋ฌธ์ ์ธ์ฝ๋ฉ ๋ฐฉ์์ด ์ฌ์ฉ. ๋ฌธ์์ ๊ธฐํธ๋ฅผ ์ ์ ๊ฐ์ผ๋ก ๋ณํํ์ฌ ํ์ผ์ ์ ์ฅ
- ์ค ๊ตฌ๋ถ: ์ค๋ฐ๊ฟ์ด๋ ์บ๋ฆฌ์ง ๋ฆฌํด๊ณผ ๊ฐ์ ํน์ ๋ฌธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๊ตฌ๋ถ. ์๋ฅผ ๋ค์ด, UNIX ๊ธฐ๋ฐ ์์คํ ์์๋ \n(Line Feed, LF)์ ์ฌ์ฉ, Windows์์๋ \r\n(Carriage Return + Line Feed, CRLF)์ ์ฌ์ฉ
- ํน์ง:
- ์ฌ๋์ด ์ฝ์ ์ ์๋ ํ์: ํ ์คํธ ํ์ผ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋์ด ์ฝ๊ณ ์์ ํ ์ ์๋ ํ์
- ๊ฐ๋ ์ฑ: ํ ์คํธ ํ์ผ์ ์ผ๋ฐ ํ ์คํธ ์๋ํฐ(์: Notepad, vim, emacs)๋ก ์ด์ด ๋ณผ ์ ์์.
- ํ์ผ ํฌ๊ธฐ: ํ ์คํธ ํ์ผ์ ๋์ผํ ๋ฐ์ดํฐ์ ์ด์ง ํ์ผ์ ๋นํด ํ์ผ ํฌ๊ธฐ๊ฐ ๋ ํด ์ ์๋ค. ์ด์ ๋ ๋ฐ์ดํฐ๊ฐ ๋ฌธ์๋ก ํํ๋๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ๋ฌธ์ ์ธ์ฝ๋ฉ ์ค๋ฒํค๋๊ฐ ํฌํจ๋๊ธฐ ๋๋ฌธ
- ์์:
- .txt, .csv, .html, .xml ๋ฑ์ ํ์ผ ํ์ฅ์๋ค์ด ์ผ๋ฐ์ ์ผ๋ก ํ ์คํธ ํ์ผ๋ก ์ ์ฅ
์ด์ง ํ์ผ : ์ปดํจํฐ์์ ๋ฐ์ดํฐ๋ฅผ ํํํ๋ ๋ฐฉ์ ๊ทธ๋๋ก ์ ์ฅ
- ์ ์ฅ ๋ฐฉ์:
- ๋ฐ์ด๋๋ฆฌ ํ์: ์ด์ง ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ปดํจํฐ ๋ด๋ถ์์ ์ฌ์ฉํ๋ ํ์ ๊ทธ๋๋ก ์ ์ฅ. ์ฆ, ๋ฐ์ดํฐ๊ฐ ๊ธฐ๊ณ์ด๋ก ํํ๋์ด ํ์ผ์ ์ ์ฅ๋จ. ์ด์ง ํ์ผ์๋ ๋ฌธ์ ์ธ์ฝ๋ฉ, ์ค ๊ตฌ๋ถ ๋ฌธ์ ๋ฑ์ด ํ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ ํํ ๋นํธ ๋จ์๋ก ์ ์ฅ
- ํ์: ์ด์ง ํ์ผ์ ํน์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ฉฐ, ํ์ผ ํฌ๋งท์ ๋ฐ๋ผ ๋ฐ์ดํฐ๊ฐ ๋ฐฐ์ด, ๊ตฌ์กฐ์ฒด ๋ฑ์ผ๋ก ์ ์ฅ๋จ. ์ด๋ฌํ ํ์ผ ํฌ๋งท์ ํ์ผ์ ์ฝ๊ณ ์ธ ๋ ํน์ ํ๋ก๊ทธ๋จ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํด์ํด์ผ ํ๋ค.
- ํน์ง:
- ์ฌ๋์ด ์ฝ์ ์ ์๋ ํ์: ์ด์ง ํ์ผ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋์ด ์ฝ์ ์ ์๋ ํ์์ผ๋ก ์ ์ฅ๋๋ค. ์ด์ง ๋ฐ์ดํฐ๋ ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๋๊ตฌ๊ฐ ์ด๋ฅผ ํด์ํ ์ ์์ด์ผ๋ง ์ ์ฉํ๋ค.
- ๊ฐ๋ ์ฑ: ์ด์ง ํ์ผ์ ์ผ๋ฐ ํ ์คํธ ์๋ํฐ๋ก ์ด์์ ๋ ์์๋ณด๊ธฐ ์ด๋ ค์ด ๋ฌธ์๊ฐ ํฌํจ๋์ด ์๋ค. ์ ๋ฌธ์ ์ธ ์ด์ง ๋ทฐ์ด(์: Hex Editor)๋ฅผ ์ฌ์ฉํ์ฌ ํ์ธํ ์ ์๋ค.
- ํ์ผ ํฌ๊ธฐ: ์ด์ง ํ์ผ์ ๋์ผํ ๋ฐ์ดํฐ์ ํ ์คํธ ํ์ผ๋ณด๋ค ๋ ์์ ์ ์๋ค. ๋ฐ์ดํฐ๊ฐ ์ง์ ์ ์ผ๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ธ์ฝ๋ฉ๊ณผ ๊ด๋ จ๋ ์ถ๊ฐ์ ์ธ ์ค๋ฒํค๋๊ฐ ์๋ค.
- ์์:
- .exe(์คํ ํ์ผ), .jpg(์ด๋ฏธ์ง ํ์ผ), .mp4(๋น๋์ค ํ์ผ), .dat(๋ฐ์ดํฐ ํ์ผ) ๋ฑ
์์
- ํ
์คํธ ํ์ผ :
- ํ์ผ ๋ด์ฉ: "Hello, world!"
- ASCII ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ฌ ํ์ผ์ ์ ์ฅ๋๋ฉฐ, ํ ์คํธ ์๋ํฐ์์ ์ง์ ์ด์ด ๋ณผ ์ ์๋ค.
- ์ด์ง ํ์ผ :
- ํ์ผ ๋ด์ฉ: JPEG ์ด๋ฏธ์ง ํ์ผ
- ํ์ผ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ์ด๋ฏธ์ง์ ํฝ์ ์ ๋ณด๋ฅผ ํฌํจํ ์ด์ง ํ์์ผ๋ก, ์ผ๋ฐ์ ์ธ ํ ์คํธ ์๋ํฐ๋ก๋ ์๋ฏธ๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ต๋ค.
์ด์ง ํ์ผ ์ฐ๊ธฐ
***** ์ด์ง ๋ฐ์ดํฐ ์ถ๋ ฅํจ์๋ fwrite ์ด๋ค *****
#include <stdion.h>
#define SIZE 5
int main(void)
{
int buffer[SIZE] = { 10, 20, 30, 40, 50 };
FILE *fp = NULL;
fp = fopen("binary.bin", "wb");
if (fp == NULL)
{
fprintf(stderr, "binary.bin ํ์ผ์ ์ด ์ ์์ต๋๋ค.");
return 1;
}
fwrite(buffer, sizeof(int), SIZE, fp);
fclose(fp);
return 0;
}
์ด์ง ํ์ผ ์ฝ๊ธฐ
***** ์ด์ง ๋ฐ์ดํฐ ์ ๋ ฅํจ์๋ fread ์ด๋ค *****
#include <stdion.h>
#define SIZE 5
int main(void)
{
int i;
int buffer[SIZE];
FILE *fp = NULL;
fp = fopen("binary.bin", "rb");
if (fp == NULL)
{
fprintf(stderr, "binary.bin ํ์ผ์ ์ด ์ ์์ต๋๋ค.");
return 1;
}
fread(buffer, sizeof(int), SIZE, fp);
for(i = 0 ; i < SIZE ; i++)
printf("%d ", buffer[i]);
fclose(fp);
return 0;
}
- ์ด์ง ํ์ผ ์ฐ๊ธฐ / ์ฝ๊ธฐ๊ฐ ์ ์ํ๋์๋ค๋ฉด, fwrite์์ ์ ์๋ ๋ด์ฉ( ex 10, 20, 30, 40, 50 )์ด ์ฝํ์ผ ํ๋ค.
์ด์ง ํ์ผ ์ ์ถ๋ ฅ ์์ - ๊ตฌ์กฐ์ฒด
fseek() ํจ์
- C ์ธ์ด์์ ํ์ผ์ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์น๋ฅผ ์กฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ด ํจ์๋ ํ์ผ ์คํธ๋ฆผ์ ํ์ฌ ์์น๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ํ๋ ์์น์์ ๋ฐ์ดํฐ ์ฝ๊ธฐ๋ ์ฐ๊ธฐ๋ฅผ ํ ์ ์๊ฒ ํด์ค๋ค. ํ์ผ์ ํน์ ์์น๋ก ํฌ์ธํฐ๋ฅผ ์ด๋์ํฌ ๋ ์ ์ฉํ๋ค.
ex)
int fseek(FILE *stream, long offset, int whence);
ex)
fseek(fp, 2, SEEK_SET) : ํ์ผ์์ ์ํ๋ ์์น์ ์ ๊ทผํ๊ณ ์ถ์ผ๋ฉด ํด๋น ํฌ์ธํฐ๋ฅผ ์ฎ๊ฒจ์ฃผ์ด์ผ ํ๋๋ฐ, ์ด๊ฒ์ fseekํจ์๋ผ๊ณ ํ๋ค. ์ค๋ฅธ์ชฝ์ ํ์๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ผ๋งํผ ์์ง์ผ ๊ฒ์ธ์ง ์์ฒญ
< whence์ ๊ฐ >
SEEK_SET : ํ์ผ์ ์์์ ๊ธฐ์ค์ผ๋ก ์ด๋
SEEK_CUR : ํ์ฌ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋
SEEK_END : ํ์ผ์ ๋(EOF) ์ ๊ธฐ์ค์ผ๋ก ์ด๋
ex) ํ์ผ์ ์ฒ์์ผ๋ก ์ด๋ : fseek (fp, 0, SEEK_SET)
ex) ํ์ผ์ ๋์์ 10๋ฐ์ดํธ ์์ชฝ์ผ๋ก ์ด๋ : fseek(fp, -10, SEEK_END)
'C Programming Language > C' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C์ธ์ด ๋์ ํ ๋น๊ณผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ (0) | 2024.08.13 |
---|---|
C์ธ์ด์ ์ ์ถ๋ ฅ๊ณผ ํ์ผ ์คํธ๋ฆผ(stream)์ ๋ํด ์์๋ณด๊ธฐ (1) (0) | 2024.08.12 |
C์ธ์ด ํฌ์ธํฐ์ ํ์ฉ : const, volatile, void ํฌ์ธํฐ (0) | 2024.08.12 |
C์ธ์ด ํฌ์ธํฐ์ ํ์ฉ : ์ด์ค ํฌ์ธํฐ, ํฌ์ธํฐ ๋ฐฐ์ด, ํจ์ ํฌ์ธํฐ (0) | 2024.08.02 |
C์ธ์ด ๊ตฌ์กฐ์ฒด union, enum, typedef ๋? (0) | 2024.08.02 |