Prosto
파일 입출력 오류 / 해결 방법 본문
기본적인 파일 입출력에 관한 글을 보고 싶으시면 여기를 누르시면 됩니다.
파일 입출력에 대하여 진행 중 겪을 수 있는 문제를 나열하고
해결 방법을 쓰겠습니다.
먼저, C4996 에러입니다.
이런 에러 문구가 나오는 거죠.
이는 scanf와 같은 에러, 혹은 경고입니다.
fopen은 보안 상 좋지 않으니 fopen_s를 쓰라는 거죠.
scanf를 공부할 때 scanf_s를 쓰지 않고 그냥 쓰기 위해서 define 처리를 해준 적이 있을 것입니다.
여기서도 fopen을 그냥 사용하기 위해서는 define처리를 해주면 됩니다.
#include<stdio.h> 위에 추가해주세요.
그렇지만 fopen_s를 쓰는 게 보안상 좋으니 사용 방법의 차이점을 볼까요?
fopen과 fopen_s 함수의 차이점은
fopen은 파일포인터에 직접 받지만
fopen_s는 파일포인터의 주소를 받습니다.(함수를 통해 간접적으로)
1. fopen의 FILE *fp에 사용 시.
fp = fopen("FileName.txt", "wt");
2. fopen_s의 FILE *fp에 사용 시.
FILE *fp;
fopen_s(&fp, "FileName.txt", "wt");
차이를 아시겠나요?
fopen은 함수 결과를 fp에 직접 대입해줬지만,
fopen_s는 함수를 통하여 fp 주소에 넣는 처리까지 해줬습니다.
다음으로 실행까지는 됐지만, 결과가 안 나오고 에러가 나오는
Debug Assertion Failed!이라는 Runtime Library 에러입니다.
Program:
.....exe
File: minkernel\crts\ucrt\src\stdio\output.cpp
Line: 31
Expression: stream != nullptr
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
라고 에러창이 뜨죠.
이는 비어있는 포인터를 참조하여 사용하려고 해서 나오는 에러입니다.
파일포인터에서는 FILE *fp;에서 fp가 비어있는데
거기에 fprintf나 fscanf 등을 사용하려고 시도했기 때문에 이런 에러가 나오는 것입니다.
일단 포인터가 비어있는 경우는 포인터 참조를 하지 않도록 해줘야겠죠?(예외 등록)
파일 포인터에서는 아래의 스크린샷처럼 예외 처리를 해주면 됩니다.
NULL인지 확인해주면 포인터가 비어있는지 확인할 수 있죠.
이렇게 에러는 안 나오고 실패했다고 알려주고 프로그램이 종료됩니다.
그렇지만 실패라고 결과가 나오는 것은 해결된 것이 아니죠?
여기선 결과적으로 포인터가 비어있는 것이니 문제를 찾아봐야겠죠?
일단 제가 확인한 바로는 경로가 주드라이버 바로 밑으로 되어 있는 경우는
파일을 제대로 생성해주지 않는다는 것입니다.
fopen을 제대로 사용했는데 파일 포인터에 제대로 주소가 들어가지 않는다면
경로를 바꿔보세요. 상대경로로 바꿔줘도 되고, 직접경로로 다른 폴더나 드라이버를 지정해주어도 됩니다.
(직접 경로로 D드라이버 하위로 만든 경우 제대로 fopen이 됨.)
(C:\에도 하위 폴더를 만들면 가능하겠죠?)
[ "C:\\TestFolder\\ex.txt" 같은 식으로요. ]
(상대 경로로 생성하는 경우 해당 프로젝트 파일 위치에 만들어져 제대로 fopen이 됨.)
오류 해결에 도움이 좀 됐나요?
다른 오류와 해결 방법을 찾으면 또 추가하겠습니다.
'Programing > C Programing' 카테고리의 다른 글
파일입출력과 문자열 문제 풀기2 -C언어 (0) | 2016.09.20 |
---|---|
파일입출력과 문자열 문제 풀기 -C언어 (0) | 2016.09.20 |
파일 입출력(FILE*) 이해, 예제 -2 -C언어 (2) | 2016.09.19 |
do while문(반복문3) 이해, 예제 -C언어 (0) | 2016.09.17 |
while문(반복문2) 이해, 예제 -C언어 (10) | 2016.09.17 |