Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[5923] Re:[질문] 간단한 view 프로그램인데요..
cc1232 [] 2493 읽음    2007-01-02 04:53
컴파일러도 안 깔려있고, 실력도 고수가 아닌데, 걍 답변을 달아봅니다.
답변이 틀릴 수 있으니 확인해 보세요

: 1. [문제점] 실행해 본 결과 두가지 문제점이 있었는데요. 파라미터가 없이 실행할 경우에 파일명을 저장하는
:                   문장 _FP.fp = gets(_FP.fn); 에서 _FP.fp 에 NULL 값이 입력되어 지네요. 변수 두개 모두가 포인터형
:                   이므로 변수 _FP.fp 에는 fn에 대입되어 있는 주소값이 들어와 있어야 하는데 NULL값이 들어가는
:                   이유를 모르겠습니다. 하지만 파일명이 있다고 가정하고 입력했을때 _FP.fp에는 NULL값이 입력되어
:                   있지만(디버깅으로 확인결과) 파일은 제대로 출력된다는 겁니다...이유를 모르겠네요..

_FP라는 구조체가 원래 전역변수로 잡혀있었으므로, _FP의 내용들이 NULL로 되어 있었을 겁니다. _FP.fp던 _FP.fn이던 NULL값을 갖고 있었다는 말이죠.(원하시는 구문 이전에 해당 변수값을 확인하시면 될 겁니다) 할당된 메모리가 없이 메모리 주소값만으로 문자열을 입력받게 되면 엉뚱한 메모리가 깨지는 현상이 발생합니다. malloc등을 이용한 메모리 할당을 하시거나 문자 배열을 선언하셔서 그곳에 문자열을 입력 받으세요. 파일이 정상적으로 출력된다는 이유는 아마도 0번지에 문자열을 입력받고 0번지부터 적힌 값을 읽어서 정상적으로 동작하는 걸 겁니다. 시스템에 따라서 0번지에 뭔가를 쓰면 리셋되는 것들도 있습니다.(NULL이 0인건 아시죠?)

: 2. [문제점] result = fopen(_FP.fp, "r"); 의 printf("%X", result); 라는 코드를 넣으면 실제 파일의 포인터값을 의미
:                   하는지요.실제로 실행해본 결과 같은 값이 16진수 형태로 나오는데요..이것도 이해할 수가 없네요.

16진수 형태로 나오는건 "%X"로 출력하셔서 그렇습니다. "%d"로 출력하셨다면 10진수로 나왔겠죠
파일 포인터는 메모리 포인터와 전혀 다릅니다. 포인터라는 단어만 같을 뿐이죠. 메모리 포인터는 주소값을 나타내지만 파일은 주소값을 나타낼 수 없으므로 안에 갖고 있는 파일 오픈 테이블의 인덱스를 나타내게 됩니다. 다른 말로는 파일 디스크립터 혹은 파일 핸들(그냥 핸들이라고도 부름)이라고 부릅니다.





땅콩이 님이 쓰신 글 :
: //TEXT VIEW PROGRAM
: #include <stdio.h>
: #include <conio.h>
: #include <stdlib.h>
: #define PARA_HAVE 2
: #define PARA_NONE 1
: int ch;
: struct FILE_POINTER{char *fp, *fn, *fd; } _FP;
: FILE *result;
: void scr_print(void);
:
:
: void main(int argc, char *argv[]){
:     if(argc == PARA_HAVE){
:              _FP.fn = argv[1];
:              _FP.fp = _FP.fn;
:              printf("\n");
:              scr_print();
:                             }
:     else if(argc == PARA_NONE){
:     printf("\nInput File Name : ");
:              _FP.fp = gets(_FP.fn);
:              clrscr();
:              scr_print();
:                           }
:     else exit(-1);
:                                                       }
:
: void scr_print(void){
:     result = fopen(_FP.fp, "r");
:     if((result == NULL)){
:         printf("\nCan't Open File [%s]", _FP.fp);
:         printf("\nUsage: VIEW2.EXE FILE_NAME");
:                      }
:     else{
:     printf("/** Opend File Name: %s/, /AND File Pointer: 0x%X**/", _FP.fp, result);
:     printf("\n[LIST]\n");
:     while(!feof(result)){
:     ch = fgetc(result);
:     printf("%c", ch);   }
:     fclose(result);
:     printf("/**  End Of File  **/ Press Any Key.."); getch();
:             }
:                                 }
: /*
: 연습삼아 텍스트 파일 뷰어를 만들어 보았는데요.
: 우선, 파라미터를 입력하는 경우와 입력하지 않는 경우로 프로그램이 실행 됩니다.
: 1. [문제점] 실행해 본 결과 두가지 문제점이 있었는데요. 파라미터가 없이 실행할 경우에 파일명을 저장하는
:                   문장 _FP.fp = gets(_FP.fn); 에서 _FP.fp 에 NULL 값이 입력되어 지네요. 변수 두개 모두가 포인터형
:                   이므로 변수 _FP.fp 에는 fn에 대입되어 있는 주소값이 들어와 있어야 하는데 NULL값이 들어가는
:                   이유를 모르겠습니다. 하지만 파일명이 있다고 가정하고 입력했을때 _FP.fp에는 NULL값이 입력되어
:                   있지만(디버깅으로 확인결과) 파일은 제대로 출력된다는 겁니다...이유를 모르겠네요..
: 2. [문제점] result = fopen(_FP.fp, "r"); 의 printf("%X", result); 라는 코드를 넣으면 실제 파일의 포인터값을 의미
:                   하는지요.실제로 실행해본 결과 같은 값이 16진수 형태로 나오는데요..이것도 이해할 수가 없네요.
:
:                   고수분들의 도움 부탁드립니다.
:
: */

+ -

관련 글 리스트
5922 [질문] 간단한 view 프로그램인데요.. 땅콩이 2600 2006/12/30
5923     Re:[질문] 간단한 view 프로그램인데요.. cc1232 2493 2007/01/02
5924         Re:Re:[질문] 간단한 view 프로그램인데요.. 서재호 2360 2007/01/02
5926             Re:Re:Re:[질문] 간단한 view 프로그램인데요.. cc1232 2543 2007/01/02
5927                 Re:Re:Re:Re:[질문] 간단한 view 프로그램인데요.. 서재호 2525 2007/01/03
5933                     Re:Re:Re:Re:Re:[질문] 간단한 view 프로그램인데요.. 남병철.레조 2451 2007/01/06
5928                     Re:Re:Re:Re:Re:[질문] 간단한 view 프로그램인데요.. cc1232 2443 2007/01/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.