c언어 질문입니다. (제목도 적당한것이 떠오르질 않아..)

sydsyddl의 이미지

int load_member_data(char *file_name, MEMBER member_list[])
{
	int count; // used for index of member list
	FILE *fp;
	MEMBER m;
 
	// open data file
	fp = fopen(file_name, "r");
	if (fp == NULL) {
		fprintf(stderr, "Can't open %s!!!", file_name);
		exit(1);
	}
 
	// read data
	count = 0;
	while (!feof(fp)) {
		fscanf(fp, "%d%s%s", &m.member_id, &m.member_name, m.member_ssn);
		member_list[count] = m;
		count++;
	        if(count >= MAX_MEMBERS) {
			fprintf(stderr, "Too many data in %s !!", file_name);
		}
	}
 
 
	fclose(fp);
	return count;
}

메인에서 member.dat라는 파일이름을 인자로 넘겨받아서 그안의 자료들을

member_list 구조체 배열에 집어넣는 함수인데

음.. member.dat라는 파일이

1 뇽뇽이 1611111
2 포로리 2183821
3 후르륵 3333333
5 주르륵 5555555
4 날봐날 4444444

이런식으로 되어 있습니다.

load_member_data라는 함수에서 fscanf를 이용해서

member_id, member_name, member_ssn 각각 맴버변수들에 집어넣게 되는데요

gcc로 컴파일 해서 실행을 하니까

count값이 6이 되고

visual c++9.0환경에서 컴파일 하고 실행을 하니까

count값이 5가 됩니다.

그러니까..

member.dat라는 파일에 자료가 다섯개가 있으니까

count값이 5가 되어야 정상인데

member.dat라는 파일을 읽어들이는 과정에서

vi에디터가 조금 다르게 읽어들이는건지

count값이 6이 됩니다

(자료를 여섯개 받아들이고 member_list[5]에 쓰레기 값이 들어가더라구요)

깊은 내용을 잘 몰라서 이렇게 여쭈어봅니다..

(질문하는 제가 모자라서 질문도 참 힘들게 합니다;;)

잘 부탁드려요ㅠㅠ

codepage의 이미지

1. fscanf(fp, "%d%s%s", &m.member_id, &m.member_name, m.member_ssn);

MEMBER 구조체 선언이 어떻게 되어 있는지 보구싶구요.
제 생각에는
fscanf(fp, "%d%s%d", &m.member_id, m.member_name, &m.member_ssn);
이렇게 되어야 되지 않나 싶네요.

2. 환경 등의 문제
일단 Visual C++ 9.0과 gcc를 쓰셨다고 했는데.
그럼 하나는 Windows환경 하나는 UNIX환경에서 돌리셨나요? 'vi에디터가 조금 다르게 읽어들인다'는 말씀은 이해가 잘 안 감..
두 환경에서 동일한 file을 가지고 test를 해보셨는지 궁금하고요.
한번 file을 ftp binary mode로 다운로드 받으셔서.뭐 울트라에디터나 Visual Studio 같은 것으로..화일 내용을 직접 들여다 보시는 것도
좋은 방법입니다.

sydsyddl의 이미지

member_ssn은 char배열로 되어있습니다.

주민등록번호는 정수형으로 선언해서 연산에 쓰이는게 아니라서

일단 char배열로 선언했구요

환경에 대해서는

하나는 windows환경 하나는 UNIX환경에서 돌린게 맞습니다.

두환경에서 동일한 파일로 test를 했습니다.

pizza1977의 이미지

혹시 공백문자가...

-------------
포탈이는 불사신

-------------
포탈이는 불사신

sydsyddl의 이미지

공백문자는 확인해봤으나 없더라구요 : )

neogeo의 이미지

개행문자의 style 에 따라 좀 문제가 생길 수 있습니다. 일단 둘다 5 이상의 숫자가 나왔으므로

개행문자가 6회 나왔음을 알 수 있습니다. ( 0 ~ 5 )

마지막줄에 빈 carriage return 값이 있다는 가정하에 \r\n 과 \n 의 개행문자 해석차에 의해 os 별로 line 수를 다르게 볼 수 있습니다. ( 즉 eof 해석이 달라질 수 있습니다. )

파일의 제일 마지막행이 비어있다면 그 부분을 지우고 data의 맨 뒷자리가 실질적인 EOF 가 되게 하고 다시 실행해보시면 좀 더 확실할거 같습니다.

Neogeo - Future is Now.

Neogeo - Future is Now.

primewizard의 이미지

neogeo님의 의견처럼 저도 개행문자 문제처럼 보입니다.
그리고 한번 fopen(file_name, "rb") 처럼 "b"옵션 추가해서 시도해 보세요.

bushi의 이미지

feof() 에 대한 오해때문일 것 같은데요.

 count = 0;
 while (count < max_count) {
    retnum = fscanf(..., &a, &b, &c);
    if (feof(...))
        break;
    if (retnum != 3) {
        fprintf(stderr, "malformed input @%d\n", count);
        continue;
    }
 
    ...
 
    count++;
 }

OTL

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.