C 텍스트파일에 공백(whitespace)이 없을때
글쓴이: nosu1234 / 작성시간: 월, 2018/05/14 - 9:06오후
안녕하세요 지금 코딩연습을 하고있는데
현재 제가 만든 코드는 person.txt 이라는 텍스트파일을 열어서 그안에 있는 데이터를 이름, 나이, 생년월일 순서대로 프린트 하는건데요.. 현재 코드는 이렇습니다.
#include <stdio.h> #include <stdlib.h> #include <string.h> struct Person { char Fname[30]; char Lname[30]; int Age; char DoB[30]; }; int main(){ struct Person p1; FILE *myFile; myFile = fopen("person.txt", "r"); if(myFile == NULL) { printf ("could not find a file\n"); exit (0); } while(1){ fscanf(myFile, "%s\t%s\t%d\t%s\n", &p1.Fname, &p1.Lname, &p1.Age, &p1.DoB); printf("Fname:%s\tLname:%s\tAge:%d\tDoB:%s\n", p1.Fname, p1.Lname, p1.Age, p1.DoB); if(feof(myFile)){ break; } } fclose(myFile); return 0; }
제가 만든 person.txt 텍스트파일은 이런식입니다
Sean Rho 23 1994/03/28 Jenny Park 23 1994/10/28 Kevin Kim 25 1993/12/26 Edward Lee 56 1966/11/04
현재 프로그램을 실행했을때 아웃풋은 이렇게 성공적으로 잘 나오는데요...
Fname:Sean Lname:Rho Age:23 DoB:1994/03/28 Fname:Jenny Lname:Park Age:23 DoB:1994/10/28 Fname:Kevin Lname:Kim Age:25 DoB:1993/12/26 Fname:Edward Lname:Lee Age:56 DoB:1966/11/04
저의 질문은 만약 person.txt 텍스트파일에 데이터들이
SeanRho231994/03/28 JennyPark231994/10/28 KevinKim251993/12/26 EdwardLee561966/11/04
이런식으로 데이터들중간에 공백이 없을시에 이름,나이,생년월일순으로 어떻게 뽑을수잇을까요?
Forums:
뒤에서부터 자르세요.
뒤에서부터 자르세요.
답변 감사합니다
답변 감사합니다
뒤에서부터 자르라고 답변해주셧는데
텍스트안에 데이터들을 한줄씩 array에 넣고 뒤에서 부터 자르면 될까요?
제가 지금 데이터들을 array에 한줄씩 넣을려는데 모든 데이터들이 한번에 다들어가네요....
입력이 매우 규칙적이라면 scanf 만으로도 해결
입력이 매우 규칙적이라면 scanf 만으로도 해결 가능합니다.
1) 이름은 항상 영문이고 이름+성으로 되어 있고, 이름과 성은 각각 두 글자 이상이며 첫글자만 대문자이고 나머지는 소문자이다.
2) 나이는 두 자리 숫자이다.
하지만 이름은 둘째치고 나이가 두 자리라는 건 좀 무리겠지요.
이제는 다른 분 말씀처럼 뒤에서부터 원하는 자리만큼 잘라가며 쓰거나(한줄씩 넣는 거 맞습니다), 아니면 정규표현식이라는 아주 좋은 도구가 있습니다만 C에서 정규식을 쓰려면 그것도 꽤나 일일 것 같긴 합니다.
좋은 하루 되세요!
답변 정말 감사합니다!fscanf(myFile, "
답변 정말 감사합니다!
혹시 여기서 %c[a-z]하고 p.Fname+1 이부분이 이해가잘안가는데 설명좀 더 해주실수잇나요?
%[a-z] : 대괄호 속에 들어있는 문자집합에
%[a-z] : 대괄호 속에 들어있는 문자집합에 해당하는 문자들만 읽고, 여기에 해당되지 않는 문자가 나오면 거기서 멈춥니다. 따라서 abc1 이 입력버퍼에 있으면 "abc"까지만 읽게 되죠.
p.Fname+1 은 &(p.Fname[1])과 같습니다. p.Fname은 Fname배열의 첫번째 원소의 주소이고, 여기에 1을 더하면 두번째 원소의 주소가 되죠. 이름의 첫글자는 대문자라서 %[a-z]로 읽을 수 없으니까, 별 수 없이 그 첫글자만 %c로 읽어서 Fname의 첫번째 원소로 저장하고, 그 뒤에 읽은 소문자 부분은 Fname의 두번째 원소부터 저장하게 한 겁니다.
결과적으로 SeanRho 라는 입력이 있으면 S는 %c 포맷에 의해 읽혀서 Fname[0]에 들어가고, ean은 %[a-z]에 의해 읽혀서 Fname[1]부터 [4]까지 'e', 'a', 'n', '\0' 순으로 저장됩니다. 이제 Fname 을 처음부터 출력하면 "Sean"이 되죠.
좋은 하루 되세요!
답변 감사합니다!
답변 감사합니다!
덕분에 다 이해가됬네요
지금은 추천해주신 정규표현식으로 하나하나 해보고있습니다!
댓글 달기