fopen +r 모드로 갱신시에...
fopen으로 파일을 다음과 같이 열고
fp = fopen("aaa", "r+");
c = fgetc(fp);
c += 2;
fputc(c, fp);
fclose(fp);
를 하면 (즉, r+로 갱신 모드로 열고 fgetc로 하나 읽은 후 fputc로 하나 쓰면) 데이터가 기록이 안됩니다.
이와 반대로 fputc를 먼저 호출하고, fgetc를 하면 이상한 위치의 값을 읽어옵니다.
fputc와 fgetc 사이에 fseek가 있을 경우에는 정상 동작을 합니다. 이때 이상한 점은 fseek 의 값이 +든 -든 상관이 없는 것입니다. 즉 fputc와 fgetc가 연달아서 호출이 되면 둘중 하나가 오동작을 하고 fseek를 중간에 써주면 둘다 정상동작을 하는 것인데요.
그렇다라는 것은 fputc와 fgetc가 인자로 넘어가는 fp에 대해 내부에서 무언가 꼬이는 것 같은데요 그런데 또 웃긴것은 ftell로 현재 포인터를 읽어보면(물론 파일 포인터야 fp 하나만 사용하니까요) fputc 이후건 fgetc이후건 fp의 값은 꾸준히 1씩 증가한다는 것이죠.
예를 들어 파일의 내용이 ABCDEFGHIJK... 라면
fgetc - A를 읽어옴, fp = 1 (0에서 1증가)
fgetc - B를 읽어옴, fp = 2
fgetc - C를 읽어옴, fp = 3
C를 교체하기 위해 fseek -1, fp = 2
fputc - C를 X로 교체, fp = 3 (2에서 1증가)
fgetc - D를 읽어오기를 기대함 그러나 B를 읽어옴, fp = 4
fgetc - E를 읽어오기를 기대함 그러나 C를 읽어옴, fp = 5
fgetc - F를 읽어오기를 기대함 그러나 D를 읽어옴, fp = 6
위와 같습니다. 아직 fputc를 한 내용이 업데이트 되지 않은 상태로 읽어오는 것이지요. 그런데 fp는 여전히 증가하고 있습니다. 재미있지 않나요? :)
질문이 조금 두서가 없습니다만, 혹시 알고 계시거나 스치는 생각이 있는 분들은 리플 달아주시면 감사하겠습니다.
P.S. 원래 목적은 r+ 모드로 파일을 읽은 후 파일 안의 내용을 변경하기 위함이었습니다.
댓글 달기