[질문] 다음 c프로그래밍에서 뭐가 잘못 됐을까요?

redpig의 이미지

#include<stdio.h>
#include<string.h>

int main(int argc,char **argv)
{
int flag;
char *name,*p;
FILE *fp;

if(argc !=3) {
        printf("usage:%s <name> <point>\n",argv[0]);
        exit(0);
}

fp=fopen("log","a");
while(!feof(fp)) {
        fscanf(fp,"%s :: %s\n",&name,&p);

        if(!strcmp(name,argv[0]) && !strcmp(p,argv[2])) {
                flag=0;
                break;
        }
        else {
                flag=1;
                break;
        }
}

if(flag==1)
        fprintf(fp,"%s :: %s\n",argv[1],argv[2]);

fclose(fp);

return 0;
}

다들 잘 아시겠지만 name과 point를 받아서 log 파일에 기록하는데 이전에 기록된거면 중복해서 기록하지 않도록 만들어봤거든요..근데..
./program aaa bbb
이런식으로 계속 실행하면 실행할때마다 log에 중복해서 기록이 되네요..
뭐가 잘못 된걸까요?

그리구 제가 c언어를 공부한지 얼마 안되서요..혹시 위 소스에서 개선해야 될점이나 잘못된점 있으면 지적바랍니다..(워낙 간단한 거라 지적할 것도 없겠지만요..-_-;)

lunarainbow의 이미지

redpig wrote:
#include<stdio.h>
#include<string.h>

int main(int argc,char **argv)
{
int flag;
char *name,*p;
FILE *fp;

if(argc !=3) {
        printf("usage:%s <name> <point>\n",argv[0]);
        exit(0);
}

fp=fopen("log","a");
while(!feof(fp)) {
        fscanf(fp,"%s :: %s\n",&name,&p);

        if(!strcmp(name,argv[0]) && !strcmp(p,argv[2])) {
                flag=0;
                break;
        }
        else {
                flag=1;
                break;
        }
}

if(flag==1)
        fprintf(fp,"%s :: %s\n",argv[1],argv[2]);

fclose(fp);

return 0;
}

다들 잘 아시겠지만 name과 point를 받아서 log 파일에 기록하는데 이전에 기록된거면 중복해서 기록하지 않도록 만들어봤거든요..근데..
./program aaa bbb
이런식으로 계속 실행하면 실행할때마다 log에 중복해서 기록이 되네요..
뭐가 잘못 된걸까요?

그리구 제가 c언어를 공부한지 얼마 안되서요..혹시 위 소스에서 개선해야 될점이나 잘못된점 있으면 지적바랍니다..(워낙 간단한 거라 지적할 것도 없겠지만요..-_-;)

음냐..;; 잘못 사용하신 부분이 많이 눈에 띄는군요;;

char *name,*p;
        fscanf(fp,"%s :: %s\n",&name,&p);

스트링으로 읽어들이려면, 다음처럼 두가지 방법중 하나를 선택하세요.

1. 
char name[NAME_LEN], p[POINT_LEN];

fscanf(fp, "%s%s", name, p);


2. 

char *name, *p;

name = (char*)malloc(NAME_LEN);
p = (char*)malloc(POINT_LEN);

fscanf(fp, "%s%s", name, p);

fscanf안에 "::"이나 "\n"같은것은... 의미 없죠..;;

if(!strcmp(name,argv[0]) && !strcmp(p,argv[2])) {

이 부분의 name은 argv[1]과 비교해야 하는거 아닌가요?

while(!feof(fp)) { 
        fscanf(fp,"%s :: %s\n",&name,&p); 

        if(!strcmp(name,argv[0]) && !strcmp(p,argv[2])) { 
                flag=0; 
                break; 
        } 
        else { 
                flag=1; 
                break; 
        } 
} 

if(flag==1) 
        fprintf(fp,"%s :: %s\n",argv[1],argv[2]); 

^^;;; 의도하신바대로 표현하신것이 아닌듯 싶습니다.

이 프로그램대로라면...

처음 하나의 이름과 포인터를 가져온 후, 비교를 행하게 되는데...

이때 인자로 들어온 이름과 포인터와의 비교를 하여, 서로 다르면 그대로 중지하여, 다음줄에 인자로 들어온것을 삽입.

만일 첫번째로 읽어온 데이터가 인자로 들어온 데이터와 같으면, 역시 루프문 중지 & 프로그램 탈출. -_-;

결국 log 를 남진 못하네요.;;

어떠한 경우에라도 최고 두개의 log만을 가질 수 있겠네요.

그런데... 이 부분을 살펴보면..

fp=fopen("log","a");

appending 모드로 파일을 오픈 하였네요.

man fopen
       a      Open for appending (writing at end of  file).   The
              file  is  created if it does not exist.  The stream
              is positioned at the end of the file.

저 모드로 파일을 열면, 파일의 마지막에 포인터가 있기 때문에...

루프문에서 애시당초 진입을 못할테고..

그렇게 되면, int flag 하신것의 초기화에 영향을 받을텐데...

뭐.. 목적하는바가 잘 이해가 안되서.. 제대로 답변하기가 힘드네요. ^^;

댓글 달기

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