2016-10-10 1 views
1

이 프로그램의 경우 터미널 또는 사용자가 지정한 출력 파일 (내)에 내 이름을 써야합니다. 내가 터미널에 내 이름을 기록 할 때프로그램이 명령 줄에 지정된 이름을 사용하여 파일을 생성하지 않습니다.

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    // no output file print to screen, print name to terminal 
    if (argc < 2) 
    { 
     fprintf(stdout, "name\n"); 
    } 
    //print name to output file given by user 
    else 
    { 
     int option; 
     int fFlag = 0; 
     while ((option = getopt(argc, argv, "f:")) != -1) 
     { 
      //if case 'f' print to output file 
      switch (option) 
      { 
       case 'f': 
        fFlag = 1; // flag indicates writing name to file 
        break; 
        //case f or error 
       case '?': 
        printf("error"); 
        break; 
      } 
     } 
     //write to name to output file 
     if (fFlag) 
     { 
      FILE *file = fopen(argv[1], "w"); 
      fprintf(file, "name"); 
     } 
    } 
    return 0; 
} 

내 코드는 작동하지만 사용자에 의해 주어진 파일에 내 이름을 기록 할 때 작동하지 않습니다. 코드가 컴파일되고 실행되지만 파일은 존재하지 않습니다.

명령 줄에 파일이 없을 수 있습니다. 프로그램에 파일을 만들어야하나요?

내가 잘못하고있는 것을 이해합니다. 모두에게 감사드립니다!

+0

당신은 (a) 쓰기 액세스를 위해 열려고하는 파일 이름이'argv [1]'에 들어 있는지 확인하고, (b)'file'이 쓰기를 시도하기 전에 NULL이 아닌지 확인하고, (c) 두 파일을 모두 사용한다고 가정하고 프로그램이 실행중인 * 현재 작업 디렉토리 *가 생성하려는 파일을 설정했는지 확인하십시오. 바로 지금, (a)와 (b)는 잠재적 인 후보자로 보이며, 후자는 [스펜서의 여섯 번째 계명] (http://www.seebs.net/c/10com.html)을 위반 한 주요한 예일뿐입니다. – WhozCraig

+0

재 형식화 된 코드로, 'fprintf (file, "name");가'argc <2' case 내에있는 것 같습니다. – chux

+0

이전의 주석 이외에, 필자는 fclose (file)를 쓰는 것을 잊었다 고 생각합니다. –

답변

4

의견 작성자의 말에 덧붙여, 당신은 당신의 파싱 부분에 getopt을 사용하고 있으므로 나머지 부분을 위해 사용해야합니다!

int main... 
char *filename; /**1**/ 
... 
    case 'f': 
    fFlag = 1; 
    filename = optarg; /**2**/ 
.... 
    FILE *file = fopen(filename , "w"); /**3**/ 

설명 : getoptf:getoptf와 함께가는 옵션을 찾으려고 위하여려고하고 있다는 것을 의미한다. getopt 루프의 경우 'f'이면 해당 옵션은 변수 optarg에 저장됩니다. 최소한 GNU getopt는 argv에 대한 포인터이므로 복사 할 필요가 없습니다. 포인터 값 (위의 *2*에 있음)을 목적을 위해 만든 변수에 숨길 수 있습니다 (*1*). 그런 다음 해당 파일이 어디에 있든 관계없이 argv (*3*)에 열 수 있습니다. GNU getopt example에서 c 옵션의 치료를 참조하십시오. 당신은 당신이 사용하고있는 명령 줄을 표시하지 않은,하지만 난 그것을 추측하고

편집 [2]my-output-file.txt 인 경우 argv[1]-fargv

./foo -f my-output-file.txt 

— 같은입니다. (은 실행 파일의 이름입니다.) 따라서 fopen(argv[1], ...)은 원하는 것이 아닙니다.

+0

도움 주셔서 감사합니다! 나는 그것을 작동 시켰어. – name

관련 문제