c언어 파일 읽어오기 관련 질문입니다.
코드 연습하다가 질문 드립니다.
다름이 아니고 다음과 같은 파일이 있고, 이 파일의 0과1,2,3,4의 갯수를 출력해 주는 프로그램을 짜고 있습니다.
<읽어오는 파일의 내용은 다음과 같으며, 확장자만 map이고 일반 텍스트로 저장함>
25 25
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 2 0 3 0 2 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 3 0 1 0 3 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 2 0 3 0 2 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
<소스 코드>
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { int i,j,c,x,y; int cnt_0=0,cnt_1=0,cnt_2=0; char filename[100]; char str[100]; FILE *fp; char *check000="0"; char *check001="1"; // 20번 파일까지 순차적으로 읽어와서 판별함 for(i=1;i<=20;i++) { sprintf(filename, "file-%d.map", i); fp = fopen(filename, "r"); if(fp==NULL) { printf("File Open for reading fail!\n"); return 0; } else { printf("Checking file-%d.map... Please Wait...\n",i); c=getc(fp); while(c!=EOF) { // 파일 단어가 "숫자 공백 숫자 공백"으로 이뤄져 있음 fscanf (fp,"%s ",str); // 지형지물이 아닌 맵 규격은 필터링함 // 0일 경우 if(*str >= '0' && *str <= '0') { cnt_0++; printf("이건 0이다.\n"); c=getc(fp); } // 1일 경우 else if(*str >= '1' && *str <= '1') { cnt_1++; printf("이건 1이다\n"); c=getc(fp); } else{ cnt_2++; printf("0도, 1도 아니다.\n"); c=getc(fp); } fclose(fp); } //위의 검사가 끝나면 개별 맵 파일마다 확인 결과를 출력 printf("\n이 파일에서 0은 %d개, 1은 %d개 이며, 아무것도 아닌것은 %d개 입니다.\n",cnt_0,cnt_1,cnt_2 ); } } }
<실행결과>
Checking file-1.map... Please Wait...
지금 읽어온 숫자53이건 숫자다지금 읽어온 숫자53이건 숫자다
0번 공백은 2개, 1번 오브젝트는 0개 입니다.
0개의 시작점이 존재하므로 게임을 시작할 수 없습니다.
0개의 시작 불가능 요소가 발견되었습니다
.계속하려면 아무 키나 누르십시오 . . .
===========================================================================================================
보시다 시피 숫자를 제대로 못읽어 와버리는데요, 어떤 부분은 고쳐야 되는지 도움을 주신다면 정말 감사드리겠습니다.
좋은 저녁 되세요!
에고 잘못 올렸네요
실행결과를 잘못 올려놨습니다.
다른건 보지 마시구 숫자를 왜 인식 못해서 카운터가 올라가지 못하는지만 봐주시면 될꺼 같습니다.
감사합니다.
1. 프로그램에서 보이는 이상한 부분이라면 이런 것들
1. 프로그램에서 보이는 이상한 부분이라면 이런 것들 정도입니다.
(1) 파일에서 가장 먼저 읽어오는 데이터가 0일까요, 25의 2일까요?
(2) 숫자 x에 대해 x>=0이면서 x<=0을 만족하는 x는 0밖에 없습니다.
(3) 데이터에 숫자뿐이라면 숫자로 읽어오는 것도 좋은 방법입니다.
(4) scanf 일족은 애초에 공백 입력을 무시하기 때문에, 형식에 공백이 들어오면 꽤 골치아파집니다.
(5) 반복문 안쪽에서 파일을 닫는 함수인 fclose를 호출하고 있군요.
2. Visual Studio를 사용하고 계신다면 훌륭한 디버거가 있어서 값이 어떻게 변하는지를 보면서 추적할 수 있고,
이런 작은 프로그램인 경우에는 각 부분에 출력을 넣어 어디서 프로그램이 멈추는지를 보는 것도 방법입니다.
(두 번째는 흔히 원시 디버깅이라고 하는 방법인데 초보자 때 굉장히 좋은 추적 방법이지요.)
그나저나 파일 스트림에서 글자 하나를 얻어올 때 fgetc가 아닌 getc를 그냥 써도 괜찮은 모양이네요.
저는 이렇게 생각했습니다.
코드를 수정을 해야될꺼 같은데...
위의 지적해주신 문제에 대해 해결할 방안은 없는건가요... ㅠㅠ
아니면 참고할만한 자료라도 귀뜸해 주신다면 열심히 해보겠습니다...
HDNua님 답변을 참고하여, 사족을
HDNua님 답변을 참고하여, 사족을 붙이자면요..
전부 다 1자리 수이면 굳이 공백으로 구분할 필요가 없겠죠.
char*로 읽어들인 후 한자리씩 atoi함수를 써서 int로 고친 후, count[i]에 집어넣어서 0~5의 수를 세면 될 겁니다. int count[5];로 선언해놓고 모두 0으로 초기화시켜둔 후, i를 직접 인덱스로 쓰면 되겠네요.
조건에서 *str >= '1' && *str <= '1'라고 했는데, 그냥 *str=='1'이라고 해도 됩니다.
피할 수 있을때 즐겨라! http://melotopia.net/b
수정해 봤는데 이상합니다...
일단 텍스트 파일 읽어오는것은 다음형식과 같습니다.
첫번째 줄 : "숫자 공백 숫자 공백"
두번째 줄 부터 계속 "숫자 공백" 반복
25 25
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 2 0 3 0 2 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 3 0 1 0 3 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 2 0 3 0 2 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
여기서 0은 613개, 1은 1개, 2는 6개, 3은(그러니까 공백,0,1,2도 아닌 것) 4개입니다.
하지만 실제로 돌리면 다음과 같은 결과가 나옵니다.
"이 파일에서 공백은 0개, 숫자0은 1201개, 숫자1은 2개, 0도,1도 아닌것은 53"
아래는 제가 다시 수정해본 코드입니다.
굉장히 단순한 것인데, 막혀서 너무 답답합니다 ㅠㅠ
아마 파일에 숫자 공백 형식때문에 오류가 나는게 아닌가 싶은데...
능력자 분들의 도움을 부탁드립니다...
위에 도와주신 두분 감사드려요
<1. 프로그램에서 보이는 이상한 부분이라면 이런
<1. 프로그램에서 보이는 이상한 부분이라면 이런 것들> 이란 제목의 내용을 천천히 읽고 이해 하시면 쉽게 해결할수 있어 보여요
조급해 하지 마시고 천천히 다시 한번 해보세요
fscanf를 사용하면 공백 수를 셀수는 없을 거에요
fscanf를 사용하면 공백 수를 셀수는 없을 거에요
fscanf 말고 다른 함수를 사용해보시죠
댓글 달기