지식이 늘었다/C,C++

fopen_s EINVAL return 에 대한 고찰 ( filename 관련 )

moneydeveloper 2020. 8. 7. 11:23
반응형

UTF-8로 생성된 문자열을 file 명으로 사용하는 경우가 있었는데 fopen_s return 이 EINVAL(22)  가 되어 정확한 원인을 분석해보았다.

 

우선 fopen_s 에 대한 reference 이다. 

https://docs.microsoft.com/ko-kr/cpp/c-runtime-library/reference/fopen-s-wfopen-s?view=vs-2019

 

fopen_s, _wfopen_s

fopen_s, _wfopen_sfopen_s, _wfopen_s 이 문서의 내용 --> 파일을 엽니다.Opens a file. 이러한 버전의 fopen, _wfopen에는 CRT의 보안 기능에 설명된 대로 강화된 보안 기능이 포함되어 있습니다.These versions of fopen,

docs.microsoft.com

 

return 실패되는 원인은 아래와 같이 명시되어있다.  

 

filename 이 NULL 일때 EINVAL(22) ? 이라고하는데 내가 확인한 case 는 NULL 이 아닌데 error 가 발생하였다.

 

encoding 관련해서 어디까지 지원하는지 더 알아보자.

 

ANSI encoding 을 지원한다고 한다. 

 

그럼 ANSI 인코딩은 뭘까?

 

미국 국립 표준 협회(American National Standards Institute, ANSI) 미국의 산업 표준을 제정하는 민간단체이며, 국제표준화기구 ISO에 가입되어 있다. ANSI에서 제정된 표준을 ANSI라고 부르기도 한다. 1918년 AESC란 이름으로 창설되었으나,1928년 ASA(American Standards Association)로 이름이 변경되다가 1969년 현재 이름인 ANSI로 변경되었다.

ANSI가 제정한 표준 중 가장 유명한 것이 ASCII 코드이다.

참조 : https://namu.wiki/w/ANSI

 

 

ANSI == ASCII ??  애매하다 이럴땐 직접 test 해보면 바로 알수 있을 듯? 

 

Test 환경 

 

OS : Windows 10

IDE : Visual Studio 2017

 

Test 방식은 1byte 0x00~0xff 값을 직접 넣어서 error 가 발생하는 것들이 뭐가 있는지 직접 확인해보는식으로 확인했다. 

 

Test code 는 아래와 같다.

	char testPath[256] =  { 0 } ;
	sprintf(testPath, "C:/x.png");
	for( int i=0; i<= 255; ++i)
	{
		FILE* fp = NULL;
        
		testPath[3] = i; // 파일명을 변경.
        
		errno_t errCode = fopen_s(&fp, testPath, "wb");
		if ( fp )
			fclose(fp) ;
            
		printf("idx:%d errCode:%d\n", i, errCode);
	}

Test 결과 

더보기

idx:0 err:13
idx:1 err:22
idx:2 err:22
idx:3 err:22
idx:4 err:22
idx:5 err:22
idx:6 err:22
idx:7 err:22
idx:8 err:22
idx:9 err:22
idx:10 err:22
idx:11 err:22
idx:12 err:22
idx:13 err:22
idx:14 err:22
idx:15 err:22
idx:16 err:22
idx:17 err:22
idx:18 err:22
idx:19 err:22
idx:20 err:22
idx:21 err:22
idx:22 err:22
idx:23 err:22
idx:24 err:22
idx:25 err:22
idx:26 err:22
idx:27 err:22
idx:28 err:22
idx:29 err:22
idx:30 err:22
idx:31 err:22
idx:32 err:0
idx:33 err:0
idx:34 err:22
idx:35 err:0
idx:36 err:0
idx:37 err:0
idx:38 err:0
idx:39 err:0
idx:40 err:0
idx:41 err:0
idx:42 err:22
idx:43 err:0
idx:44 err:0
idx:45 err:0
idx:46 err:0
idx:47 err:0
idx:48 err:0
idx:49 err:0
idx:50 err:0
idx:51 err:0
idx:52 err:0
idx:53 err:0
idx:54 err:0
idx:55 err:0
idx:56 err:0
idx:57 err:0
idx:58 err:0
idx:59 err:0
idx:60 err:22
idx:61 err:0
idx:62 err:22
idx:63 err:22
idx:64 err:0
idx:65 err:0
idx:66 err:0
idx:67 err:0
idx:68 err:0
idx:69 err:0
idx:70 err:0
idx:71 err:0
idx:72 err:0
idx:73 err:0
idx:74 err:0
idx:75 err:0
idx:76 err:0
idx:77 err:0
idx:78 err:0
idx:79 err:0
idx:80 err:0
idx:81 err:0
idx:82 err:0
idx:83 err:0
idx:84 err:0
idx:85 err:0
idx:86 err:0
idx:87 err:0
idx:88 err:0
idx:89 err:0
idx:90 err:0
idx:91 err:0
idx:92 err:0
idx:93 err:0
idx:94 err:0
idx:95 err:0
idx:96 err:0
idx:97 err:0
idx:98 err:0
idx:99 err:0
idx:100 err:0
idx:101 err:0
idx:102 err:0
idx:103 err:0
idx:104 err:0
idx:105 err:0
idx:106 err:0
idx:107 err:0
idx:108 err:0
idx:109 err:0
idx:110 err:0
idx:111 err:0
idx:112 err:0
idx:113 err:0
idx:114 err:0
idx:115 err:0
idx:116 err:0
idx:117 err:0
idx:118 err:0
idx:119 err:0
idx:120 err:0
idx:121 err:0
idx:122 err:0
idx:123 err:0
idx:124 err:22
idx:125 err:0
idx:126 err:0
idx:127 err:0
idx:128 err:0
idx:129 err:22
idx:130 err:22
idx:131 err:22
idx:132 err:22
idx:133 err:22
idx:134 err:22
idx:135 err:22
idx:136 err:22
idx:137 err:22
idx:138 err:22
idx:139 err:22
idx:140 err:22
idx:141 err:22
idx:142 err:22
idx:143 err:22
idx:144 err:22
idx:145 err:22
idx:146 err:22
idx:147 err:22
idx:148 err:22
idx:149 err:22
idx:150 err:22
idx:151 err:22
idx:152 err:22
idx:153 err:22
idx:154 err:22
idx:155 err:22
idx:156 err:22
idx:157 err:22
idx:158 err:22
idx:159 err:22
idx:160 err:22
idx:161 err:22
idx:162 err:22
idx:163 err:22
idx:164 err:22
idx:165 err:22
idx:166 err:22
idx:167 err:22
idx:168 err:22
idx:169 err:22
idx:170 err:22
idx:171 err:22
idx:172 err:22
idx:173 err:22
idx:174 err:22
idx:175 err:22
idx:176 err:22
idx:177 err:22
idx:178 err:22
idx:179 err:22
idx:180 err:22
idx:181 err:22
idx:182 err:22
idx:183 err:22
idx:184 err:22
idx:185 err:22
idx:186 err:22
idx:187 err:22
idx:188 err:22
idx:189 err:22
idx:190 err:22
idx:191 err:22
idx:192 err:22
idx:193 err:22
idx:194 err:22
idx:195 err:22
idx:196 err:22
idx:197 err:22
idx:198 err:22
idx:199 err:22
idx:200 err:22
idx:201 err:22
idx:202 err:22
idx:203 err:22
idx:204 err:22
idx:205 err:22
idx:206 err:22
idx:207 err:22
idx:208 err:22
idx:209 err:22
idx:210 err:22
idx:211 err:22
idx:212 err:22
idx:213 err:22
idx:214 err:22
idx:215 err:22
idx:216 err:22
idx:217 err:22
idx:218 err:22
idx:219 err:22
idx:220 err:22
idx:221 err:22
idx:222 err:22
idx:223 err:22
idx:224 err:22
idx:225 err:22
idx:226 err:22
idx:227 err:22
idx:228 err:22
idx:229 err:22
idx:230 err:22
idx:231 err:22
idx:232 err:22
idx:233 err:22
idx:234 err:22
idx:235 err:22
idx:236 err:22
idx:237 err:22
idx:238 err:22
idx:239 err:22
idx:240 err:22
idx:241 err:22
idx:242 err:22
idx:243 err:22
idx:244 err:22
idx:245 err:22
idx:246 err:22
idx:247 err:22
idx:248 err:22
idx:249 err:22
idx:250 err:22
idx:251 err:22
idx:252 err:22
idx:253 err:22
idx:254 err:22
idx:255 err:0

결론

"아스키코드로 표현할 수 있는 문자 or 특수문자 가 들어가면 실패할 수 있다" 정도로 기억하면 문제 없을 것 같다.

반응형