cs50 5강 파일의 읽기와 쓰기
사용자에게 입력받기
참고로 비주얼 스튜디오로 코딩을 하는 사람들의 경우 scanf로 입력을 받으면 보안과 관련된 에러 메시지가 뜨는데 이는 scanf를 scanf_s로 대체하면 사라질 것이다.
scanf_s는 오버 플로우를 방지해주고 보안적인 부분이 좀 더 올라간 마이크로 소프트에서 지향하는 입력방식이라고 한다.
만약 굳이굳이 scanf를 사용하고 싶다면, #pragma 매크로를 사용하면 된다.
scanf_s로 문자열 받기
scanf와 scanf_s는 형식지정자를 사용해서 인자를 받는 부분의 사용법이 대부분 동일하다.
그런데, 문자열의 경우 버퍼 오버플로우를 방지하기 위하여 약간 다른 방법을 사용해야한다.
scanf_s("%s",문자열 변수명,(int)sizeof(문자열 변수))
이런 식으로 코드를 작성해야한다.
뒤에 문자열 sizeof는 오버플로우 방지를 위한 것인데 왜 int를 붙여야하는 걸까?
그 이유는 크기의 매개 변수가 size_t가 아니라 unsigned형식이기 때문이다.
사실 엄격하게 따지면 int보다는 size는 부호가 없으니 unsigned를 쓰는 것이 정석이기는 하다.
파일 열고 닫기
fopen
함수의 매개인자는 두개로 각각 const char 형태의 파일 이름과 모드를 뜻한다.
기본적으로 모드를 입력하지 않으면 텍스트 모드로 오픈한다고 생각하면 된다.
아차 그리고 유의해야하는 것은 파일을 열었으면 fclose를 사용하여 꼭 파일을 닫아주어야만 한다.
win api
위 강의에서는 나오지 않는 내용이나 window_api에 있는 createFile로 파일을 읽고 쓰는 것도 가능하다.
이 함수는 간단하게 설명하면 핸들을 만들고 그 핸들에 파일 읽기 속성을 부여하는 원리이다.
핸들에 들어가는 매개 인자로는 argv와 파일의 공유 및 읽기 여부 등등이 들어가게 된다.
파일의 형식 확인하기
자 내가 예전에 한번 언급한 argv, argc의 유용함을 맛 보게 되는 부분 중 한곳이다.
argc를 통해 내가 원하는 개수만큼 인자가 제대로 되었는가를 확인하고, 제대로 되지 않았다면 return을 통해 오류코드를 반환하는 것이다.
또한 argv를 통해 fopen을 하는 것도 가능하다.
code
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
return 1;
}
FILE *file = fopen(argv[1], "r");
if (file == NULL) {
fprintf(stderr, "Could not open file %s\n", argv[1]);
return 1;
}
unsigned char bytes[3];
size_t bytesRead = fread(bytes, 1, 3, file);
if (bytesRead == 3 && bytes[0] == 0xff && bytes[1] == 0xd8 && bytes[2] == 0xff) {
printf("Maybe\n");
} else {
printf("No\n");
}
fclose(file);
return 0;
}
저기 if문에서 검사하는 내용이 바로 bytes의 내용이 각각 j
,p
,g
를 가리키는가이다.
png와 같은 다른 형태의 내용들도 저런 식으로 변환을 하여 검사하면 간단하게 형식을 검사할 수 있다.
댓글남기기