[C언어] 파일관련(2) fputs(), fwrite(), fgets(), fread()
파일관련(1) 포스팅에서는 서식을 지정해서 파일에 문자열을 쓰거나 읽었다.
여기서는 서식없이 문자열을 그대로 쓰거나 읽는법을 알아보자.
- fputs(버퍼, 파일포인터);
- int fputs(char const *_Buffer, FILE *_Stream);
- 성공하면 음수가 아닌 값을 반환, 실패하면 EOF(-1)을 반환
- fwrite(버퍼, 쓰기크기, 쓰기횟수, 파일포인터);
- size_t fwrite(void const *_Buffer, size_t _ElementSize, size_t _ElementCount, FILE *_Stream);
- 성공한 쓰기 횟수를 반환, 실패하면 지정된 쓰기 횟수보다 작은 값을 반환
- fgets(버퍼, 버퍼크기, 파일포인터);
- char *fgets(char *_Buffer, int _MaxCount, FILE *_Stream);
- 성공하면 읽은 문자열의 포인터를 반환, 실패하면 NULL을 반환
- fread(버퍼, 읽기크기, 읽기횟수, 파일포인터);
- size_t fread(void *_Buffer, size_t _ElementSize, size_t _ElementCount, FILE *_Stream);
- 성공한 읽기 횟수를 반환, 실패하면 지정된 읽기 횟수보다 작은 값을 반환
- fputs() 예제
#define _CRT_SECURE_NO_WARNINGS // fopen 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h> // fopen, fputs, fclose 함수가 선언된 헤더 파일
int main()
{
FILE *fp = fopen("hello.txt", "w"); // hello.txt 파일을 쓰기 모드(w)로 열기.
// 파일 포인터를 반환
fputs("Hello, world!", fp); // 파일에 문자열 저장
fclose(fp); // 파일 포인터 닫기
return 0;
}
>> hello.txt를 열어보면 "Hello, world!"가 적혀있다!
- fwrite() 예제
#define _CRT_SECURE_NO_WARNINGS // fopen 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h> // fopen, fwrite, fclose 함수가 선언된 헤더 파일
#include <string.h> // strlen 함수가 선언된 헤더 파일
int main()
{
char *s1 = "Hello, world!";
FILE *fp = fopen("hello.txt", "w"); // hello.txt 파일을 쓰기 모드(w)로 열기.
// 파일 포인터를 반환
fwrite(s1, strlen(s1), 1, fp); // strlen으로 문자열의 길이를 구함.
// 문자열의 길이만큼 1번 파일에 저장
fclose(fp); // 파일 포인터 닫기
return 0;
}
>> hello.txt를 열어보면 "Hello, world!"가 적혀있다!
- fgets() 예제
#define _CRT_SECURE_NO_WARNINGS // fopen 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h> // fopen, fgets, fclose 함수가 선언된 헤더 파일
int main()
{
char buffer[20]; // 파일을 읽을 때 사용할 임시 공간
FILE *fp = fopen("hello.txt", "r"); // hello.txt 파일을 읽기 모드로 열기.
// 파일 포인터를 반환
fgets(buffer, sizeof(buffer), fp); // hello.txt에서 문자열을 읽음
printf("%s\n", buffer); // Hello, world!: 파일의 내용 출력
fclose(fp); // 파일 포인터 닫기
return 0;
}
>> hello.txt의 문자열이 화면에 출력됨
- fread() 예제
#define _CRT_SECURE_NO_WARNINGS // fopen 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h> // fopen, fread, fclose 함수가 선언된 헤더 파일
int main()
{
char buffer[20] = { 0, }; // 파일을 읽을 때 사용할 임시 공간, 미리 0으로 전부 초기화
FILE *fp = fopen("hello.txt", "r"); // hello.txt 파일을 읽기 모드로 열기.
// 파일 포인터를 반환
fread(buffer, sizeof(buffer), 1, fp); // hello.txt에서 버퍼 크기(20바이트)만큼 1번 값을 읽음
printf("%s\n", buffer); // Hello, world!: 파일의 내용 출력
fclose(fp); // 파일 포인터 닫기
return 0;
}
>> hello.txt의 문자열이 화면에 출력됨
ㅇfputs()
- fputs()도 파일 포인터 대신 stdout을 지정하면 문자열이 화면에 출력된다.
>> fputs("Hello, world!", stdout); // Hello, world!: 표준 출력(stdout)에 문자열 출력
ㅇfwrite()
- fwrite()도 파일 포인터 대신 stdout을 지정하면 문자열이 화면에 출력된다.
>> char *s1 = "Hello, world!";
fwrite(s1, strlen(s1), 1, stdout); // Hello, world! // 문자열 길이만큼 표준출력(stdout)에 문자열 출력
ㅇfgets()
- fgets 함수도 stdin을 지정하면 사용자가 입력한 문자열을 버퍼에 저장합니다.
char buffer[20];
fgets(buffer, sizeof(buffer), stdin); // 표준 입력(stdin)에서 20바이트만큼 문자열 읽기
// 널 문자 1바이트, 실제 문자열 19바이트
- 물론 지정한 버퍼크기 보다 작은 상태에서 엔터 키를 누르면 \n이 되므로 fgets 함수는 \n까지 입력을 받습니다(\n도 포함)
ㅇfread()
- 파일을 읽을 때 사용할 임시 공간(버퍼)를 선언해야 하는데 fread 함수를 사용할 때는 char 배열을 선언한 뒤 반드시 0으로 초기화해야 합니다(char 포인터에 동적 메모리를 할당한 뒤 0으로 초기화해도 된다)
- fread 함수에서 파일을 읽는 크기는 읽기 크기 * 읽기 횟수
- fread 함수는 fgets 함수와는 달리 \n이 있든 없든 무조건 지정된 크기만큼 읽는다.
- fread 함수도 stdin을 지정하면 사용자가 입력한 문자열을 버퍼에 저장합니다.
char buffer[20] = { 0, };
fread(buffer, sizeof(buffer) - 1, 1, stdin); // 표준 입력(stdin)에서 문자열 읽기
// 버퍼 끝에 NULL이 들어갈 수 있도록 sizeof(buffer) - 1을 지정