c++ wc 구현 질문이요.
글쓴이: jamesc1236 / 작성시간: 화, 2017/04/11 - 6:46오후
제가 지금 리눅스 wc -l, -m, -w, -c 를 구현하려고 하는데 -l -m -w 는 문제 없이 했는데 -c 에서 애를 먹고있네요.
-c 가 파일의 byte 사이즈를 프린트 하는데 저는 줄곧 -m 랑 똑같이 생각하고 코딩하다보니 만약 언어가 틀린 파일이면 사이즈도 틀려진단걸 알고 멘붕이 왔네요.
파일 사이즈 구하는건
stat(argv[i], &sb);
printf("%lld", (long long) sb.st_size); <- 이걸 사용해서 쉽게 구하는 법을 알겠는데 문제는 사이즈 구하는 방법을 int wc()에서 해결하고 싶은데
argv[] 는 메인에서만 쓸수있고.. 잘 모르겠네요.. 조언 좀 부탁합니다..
int main(int argc, char *argv[]) { int i; int total_ch, total_word, total_line; total_ch = total_word = total_line = 0; int j; j = (argc > 1) ? 1:0; int opt; bool c_On = false, l_On=false, m_On = false, w_On = false; for (int i = j; i < argc;i++){ while ((opt = getopt(argc, argv, "clmw")) != -1) { switch (opt) { case 'c': c_On=true; break; case 'l': l_On = true; break; case 'm': m_On = true; break; case 'w': w_On = true; break; default: printf("Try `wc --help' for more information.\n"); return EXIT_SUCCESS; } } } if(c_On == false && l_On == false && m_On == false && w_On == false){ if( argc == 1 ) { wc(argv[0], NULL, &total_ch, &total_word, &total_line); } else { for( i=1 ; i<argc ; i++ ) { wc(argv[0], argv[i], &total_ch, &total_word, &total_line); } } if( argc > 2 ) { printf("%7d %8d %8d total\n", total_line, total_word, total_ch); } } } int wc(char *cmdname, char *filename, int *total_ch, int *total_word, int *total_line) { int flag; struct stat st; FILE *fp; char ch; int word_flag; int num_ch, num_word, num_line; if( filename == NULL ) { fp = stdin; } else { flag = lstat(filename, &st); if( flag == -1 ) { printf( "%s: %s: No such file or directory\n", cmdname, filename); return 0; } if( S_ISREG(st.st_mode) ) { fp = fopen(filename, "r"); if( fp == NULL ) { printf("%s: %s: Permission denied\n", cmdname, filename); return 0; } } else if( S_ISDIR(st.st_mode) ) { printf("%s: %s: Is a directory\n", cmdname, filename); return 0; } else { return 0; } } num_ch = num_word = num_line = 0; word_flag = 0; while( (ch = getc(fp)) != EOF ) { ++num_ch; if( isspace(ch) ) { if( word_flag == 1 ) { word_flag = 0; ++num_word; } } else { word_flag = 1; } if( ch == '\n' ) ++num_line; } fclose(fp); printf("%7d %8d %8d %s\n", num_line, num_word, num_ch, filename); *total_ch += num_ch; *total_word += num_word; *total_line += num_line; return 0; }
Forums:
허허허...
찾았습니다..
댓글 달기