Jabi  
Front Page
Tag | Location | Media | Guestbook | Admin   
 
'2009/04'에 해당하는 글(2)
2009.04.30   fscanf()로 파일에 쓸모없는 문자를 제외하고 문자열 받기


fscanf()로 파일에 쓸모없는 문자를 제외하고 문자열 받기

가끔씩 파일 입출력을 하다보면 황당한 상황에서 파일을 입출력 받으라 할때가 있다.

예) AA 10,

' ' 문자 때문에(%s를 쓰게 되면 띠어쓰기로 받아 갈 것이다.) 

게다가 마지막 ','문자는 받지 않고 문자열을 받으라면.....!!!!!

게다가 처음 "AA"문자는 받지 않고 문자열을 받으라면.....!!!!!

%[^\n]s 이 문자의 활용을 알아 봐야한다

이 문자의 뜻은 개행 문자 \n이 나올때 까지 문자열로 받으라는 말이다

파일에 AA 10,라고 입력 되어 있다면

FILE * ifs;

ifs = fopen( "파일 이름", "rt"  );

char str[20];

fscanf( ifs, "AA %[^,\n]s ", &str);

fflush(stdin);

라고 입력해주면 AA 에서부터 ,\n를 만날때 까지 문자열로 받아들이게 된다.

이렇게 받고 나서

printf("%s",str);

해주면 10 이라고 화면에 출력 될 것이다.

그리고 중요한점 저걸 쓰고 나면 반드시 버퍼를 지워 줘야된다.

이유인즉 scanf()는 개행문자까지 받아 들이는 존재이다....

자세한건 모르겠으나 fscanf()는 원래 띠워 쓰기로 받아 들이는데 stdin에 이상한 문자가 들어가 버려서

제 위치를 찾지 못하는 것 같다. 그래서 억지로 버퍼를 지워 주도록 하자.   

fflush(stdin);

이걸 뒤에 쓰면 버퍼를 지워준다.

파일 입출력 함수에 fgets()나 여러 함수가 있지만 fscanf()만큼 효율적인 함수는 보지 못했다

더군다나 %[^\n]s 표시를 이해하게 된다면 확실히 scanf()의 위대함을 알게된다.

fcanf()와 더불어 sprintf()함수도 유용하니 찾아보기 바란다.

그럼 실전에 써보자

test(10, "sdf")

이걸 받아 들여보면

10과 sdf만 받는다고 하자

int i;

char j[10];

fscanf( ifs, "test(%d, \"%[^\")\n]s ", &i,&j);

fflush(stdin);

"를 출력하기 위해서는 \"하는건 알고 계시겠죠 ^^

알기 쉽게 풀어보면 %d(10) 숫자를 받고 , 한 다음에 "표시도 넘기고 %s(sdf)를 ")전 까지 받아라 라는 의미네요 

출처 -  내 머리속 대뇌피질 근처 어딘가에서 ㅡㅡ;;



name    password    homepage
 hidden


BLOG main image
Jabi
 Notice
 Category
분류 전체보기 (7)
c/c++ (6)
그래픽 (1)
 TAGS
 Calendar
«   2009/04   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
 Recent Entries
이차원 포인터에 이차원 배열을 넣기
오늘 알게 된 struct의 비밀
typedef에 대해서
괴로운 전처리문 #include, #define, #..
이차원 포인터 동적 할당
 Recent Comments
 Recent Trackbacks
 Archive
2010/05
2009/05
2009/04
 Link Site
 Visitor Statistics
Total : 46,363
Today : 4
Yesterday : 6
rss