C 텍스트파일에 공백(whitespace)이 없을때

nosu1234의 이미지

안녕하세요 지금 코딩연습을 하고있는데

현재 제가 만든 코드는 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

이런식으로 데이터들중간에 공백이 없을시에 이름,나이,생년월일순으로 어떻게 뽑을수잇을까요?

bushi의 이미지

뒤에서부터 자르세요.

nosu1234의 이미지

답변 감사합니다
뒤에서부터 자르라고 답변해주셧는데
텍스트안에 데이터들을 한줄씩 array에 넣고 뒤에서 부터 자르면 될까요?
제가 지금 데이터들을 array에 한줄씩 넣을려는데 모든 데이터들이 한번에 다들어가네요....

raymundo의 이미지

입력이 매우 규칙적이라면 scanf 만으로도 해결 가능합니다.

1) 이름은 항상 영문이고 이름+성으로 되어 있고, 이름과 성은 각각 두 글자 이상이며 첫글자만 대문자이고 나머지는 소문자이다.
2) 나이는 두 자리 숫자이다.

	fscanf(myFile, "%c%[a-z]%c%[a-z]%2d%s\n", p1.Fname, p1.Fname+1, p1.Lname, p1.Lname+1, &p1.Age, p1.DoB);

하지만 이름은 둘째치고 나이가 두 자리라는 건 좀 무리겠지요.

이제는 다른 분 말씀처럼 뒤에서부터 원하는 자리만큼 잘라가며 쓰거나(한줄씩 넣는 거 맞습니다), 아니면 정규표현식이라는 아주 좋은 도구가 있습니다만 C에서 정규식을 쓰려면 그것도 꽤나 일일 것 같긴 합니다.

좋은 하루 되세요!

nosu1234의 이미지

답변 정말 감사합니다!

fscanf(myFile, "%c%[a-z]%c%[a-z]%2d%s\n", p1.Fname, p1.Fname+1, p1.Lname, p1.Lname+1, &p1.Age, p1.DoB);

혹시 여기서 %c[a-z]하고 p.Fname+1 이부분이 이해가잘안가는데 설명좀 더 해주실수잇나요?

raymundo의 이미지

%[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"이 되죠.

좋은 하루 되세요!

nosu1234의 이미지

답변 감사합니다!
덕분에 다 이해가됬네요
지금은 추천해주신 정규표현식으로 하나하나 해보고있습니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.