99번까지 쓰여야 하나 파일에 14번째 데이터까지만 쓰임
아쿠아리우스
질문 제목 :
99번까지 쓰여야 하나 파일에 14번째 데이터까지만 쓰임
프로그램에 대해 간략히 설명하자면, 번호,이름,성적을 입력받는데
이름을 입력할 때 이미 파일에 쓰인 이름과 새로 입력될 이름이 중복되는지 확인합니다.
이름이 하나라도 중복되면 안되므로 입력하고 중복 없으면 저장한 후 파일을 닫고 while(1)처음으로 와
다시 파일을 연후 fscanf로 기존 이름을 읽고 새로 입력될 이름과 다시 비교하는 형식입니다.
그러니까 입력할 때마다 파일 열고 닫고를 반복합니다.
문제: 15번째 입력시 같은 이름을 입력하지 않아도 같은 이름을 입력할 수 없습니다.라는
메세지가 뜸, 1~14번째 까지는 문제없음
즉, 14번째 까지만 입력됩니다.
질문 내용 :
#includestdio.h
#includestring.h
typedef struct STUDENT{
int num; //번호
char name[10]; //이름
int score; //점수
}student;
student data[99]; //최대 99명의 데이터를 파일에서 불러올 변수
student input[99]; //입력받을 데이터를 임시 저장할 변수
void main()
{
int i=0;
int cnt=0; //입력받은 횟수를 카운트
int fcnt=0; //파일에서 읽어온 데이터수 카운트
int check=0;
while(1)
{
FILE *fp;
fp=fopen(test.txt,r+);
//데이터를 쓸 때마다 파일을 열고 닫아 바로 바로 저정합니다.
while(!feof(fp)) //파일의 데이터를 읽어오는 부분을 이름받는 윗부분으로 옮겼습니다.
{
fscanf(fp,%d%s%d,&data[fcnt].num,data[fcnt].name,&data[fcnt].score);
fcnt++;
}
for(i=0;ifcnt-1;i++) //파일에 입력되 데이터를 보여줍니다.
{
printf(%d %s %d\n,data[i].num,data[i].name,data[i].score);
}
puts(번호: );
scanf(%d,&input[cnt].num);
getchar();
while(1) //중복된 이름이 있는지 확인하는 부분
{
check=0;
printf(이름: );
scanf(%s, input[cnt].name);
getchar();
//fgets(input[cnt].name,10,stdin); 추가질문
//만약 띄어쓰기를 위해 fgets를 사용하려면 위와 같은 방식이 맞나요?
//위 처럼 하니까 이름 부분이 파일에 한 칸 내려간 것처럼 쓰이더군요.
for(i=0;i(fcnt-1);i++)
{
if(!strcmp(input[cnt].name,data[i].name))
{
printf(%s, %s\n,data[i].name,input[cnt].name);
puts(같은 이름을 입력할 수 없습니다.);
&; check=1;
break;
}
}
if(check==0) //같은 이름이 없으면 break로 while(1)을 빠져나가 점수를 입력받음
{
break;
}
}
puts(점수: );
scanf(%d, &input[cnt].score);
getchar();
fprintf(fp,%2d%10s%7d\n,input[cnt].num,input[cnt].name,input[cnt].score);
cnt++; //cnt 1씩 증가
fclose(fp); //파일 닫음
}
}
-
내꽃
맨 밑에서 fcnt=0;으로 초기화 시키니 문제없이 돌아가네요. 답글 감사합니다.
-
흰양말
구조체 밑에서 data[99]; 라고 선언하고 main() 에서 fscanf(data[fcnt} ...); 이렇게 읽게되는데, while문을 돌때마다 fcnt가 몇 배로 증가하네요. 그래서 99개의 데이터를 다 입력하지 않아도 fcnt로 인해 data[99]가 되어 더 입력받을 수 없는 거더군요. 99로 설정한 이유는 99개의 데이터까지만 받게 하기위함 입니다. 지금 이 조건들을 모두 만족 시킬 수 있는 방법을 고민 중 입니다.ㅋ
-
남자
임시 저장할 변수는 배열로 만들 필요 없이 구조체 변수로 선언 후 계속 받기만 하면 될 듯하네요~ ^^
-
어둠
1. 일단 파일을 열어 구조체 배열에 담는다. 그리고 파일을 닫는다.
2. 파일 내용을 담은 구조체 배열과 새로 받은 내용을 비교한다.
비교해서 없으면 파일 내용 담은 구조체 배열에 추가한다.
3. 구조체 배열에 다 넣었으면 그 결과를 파일에 저장한다.
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2692343 | scnaf에 자꾸 선언을 참조하라는데;; (8) | 도래 | 2025-04-22 |
2692282 | 도스상에서 생성된 exe파일에 press~ 뜨게 하기 (4) | 회사원 | 2025-04-21 |
2692256 | scanf("%*c"); ㅠㅠ 고수님들 | 거북이 | 2025-04-21 |
2692230 | 하노이탑 질문입니다. (1) | 미쁘다 | 2025-04-21 |
2692210 | 정보 올림피아드 문제인데.. 풀이 과정이 궁금합니다.(재귀함수) (5) | 물티슈 | 2025-04-20 |
2692144 | C언어와 리눅스에 대한 질문입니다. | 싴흐한세여니 | 2025-04-20 |
2692114 | 컨텍스트 스위칭하는데 걸리는 시간 측정.. | YourWay | 2025-04-19 |
2692086 | 간접참조 연산자, 증감연산자 질문이용! (2) | 블랙캣 | 2025-04-19 |
2692056 | 주석좀 달아주세요. 몇개적엇는데 몇개만달아주세요. (2) | DevilsTears | 2025-04-19 |
2691978 | 진수 쉽게 이해하는법... (3) | 지지않는 | 2025-04-18 |
2691949 | getchar() 한 문자를 입력받는 함수 질문 | 채꽃 | 2025-04-18 |
2691919 | 배열 정렬 및 합치기 질문입니다. | 사과 | 2025-04-18 |
2691845 | c언어왕초보 질문이 있습니다........ | 루나 | 2025-04-17 |
2691815 | void add(int num); 함수... (4) | 살랑살랑 | 2025-04-17 |
2691756 | 명령 프롬프트 스크롤바가 없어요 | 두메꽃 | 2025-04-16 |
2691725 | 자료구조에 관련해서 질문이 있어 글을 올립니다. | 누리알찬 | 2025-04-16 |
2691697 | if 문에서 구조체 배열에 저장되있던 문자열 검사하는 법 ? (2) | 민트맛사탕 | 2025-04-16 |
2691678 | C언어 함수 질문이요~!!! | 연보라 | 2025-04-15 |
2691650 | 반복문 | 돋가이 | 2025-04-15 |
2691618 | 링크드리스트 개념 질문이예요 (3) | 맨마루 | 2025-04-15 |