2015-02-07 8 views
0

바나나를 몰아내는 소프트웨어 공학 수업에 대한 과제가 있습니다. 주어진 파일에 대한 논리적 인 코드 행만을 계산하는 라인 카운터를 설계하라는 요청을 받았습니다. 빈 줄과 주석은 생략해야합니다.C++에서 //로 시작하는 주석 행 건너 뛰기

필자는 어떤 파일을 건든 상관없이 2 줄 씩 줄 번호를 계산한다는 점을 제외하고는 코드가 거의 작동하지 않습니다. 나는 내 생애를 위해 내 문제가 어디에 있는지 알 수 없으며 누군가 나를 도울 수 있는지 궁금해하고 있었다. 여기

내 코드입니다 :

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstring> 
#include <stdio.h> 

using namespace std; 

int main() { 

    // Initialize variables 
    ifstream infile; 
    string filename; 
    int line = 0; 

    // Get file input 
    cout << "Enter the filename" << endl; 
    cin >> filename; 

    // open the file 
    infile.open(filename.c_str()); 

    // read the lines and skip blank lines and comments 
    while(getline(infile, filename)) { 
     if(filename.empty() || filename.find("//") == true) { 
      continue; 
     } 

     // increment the line number 
     ++line; 
    } 

    // close the file 
    infile.close(); 

    // display results 
    cout << "There are " << line << " lines of code in this file." << endl; 
} 

터미널에서 다음과 같이 카운터 읽기 : "코드 24 개 라인이 파일에 있습니다."

내 계산에 따르면 22 줄의 논리 코드 만 있어야합니다. 도움을 주시면 감사하겠습니다.

+0

'infile.open (filename.c_str())'을 할 필요가 없습니다. 단순히'infile.open (filename)'을 사용하십시오. – emlai

+0

@zenith : 표준 라이브러리의 버전에 따라 다릅니다. 'std :: string' 과부하는 오랜 시간 후에 추가되었습니다. –

+2

또한 사용 방법을 모르는 경우 함수를 사용하지 않아야합니다. 'string :: find'는 문자열에서 발견 된 경우 인수의 위치를 ​​반환하고 발견되지 않은 경우에는 부울 값이 아닌'npos'를 반환합니다. – emlai

답변

1

식별하는 행을 식별하기 위해 cout << filename << '\n';과 같은 print 문을 추가하지 않는 이유는 무엇입니까? 나는 몇 개의 빈 줄을 보게 될 것으로 생각한다.

문자열에서 공백을 제거해야한다고 생각합니다. 공백이나 탭이있는 빈 행이있을 수 있습니다. 따라서 str :: empty에 관한 한 기술적으로는 비어 있지 않습니다.

또한 트림을하고 다른 버그를 수정하여 '//'를 주석으로 처리하는 것을 포함하여 코드에 나타납니다.

따라서 트림이있는 간단한 수정이됩니다.

while(getline(infile, filename)) { 

    filename = ltrim(filename); // remove leading whitespace 
    filename = rtrim(filename); // remove trailing whitespace 

    if(filename.empty() || (filename.find("//") == 0)) { 
     continue; 
    } 

    // increment the line number 
    ++line; 
} 

rtrim 및 ltrim의 구현은 on this other SO answer here입니다.

+0

이것은 나를 위해 엄청난 오류를 반환합니다. 우선 ltrim과 rtrim은 내 프로그램의 범위에서 선언되지 않았기 때문에 무효로 반환됩니다. 나는 그들이 속한 도서관을 선언하지 않는다고 생각한다. –

+0

@ n_alvarez2007 - 너를 위해 숙제를하지 않을거야. 스택 오버플로는 자신의 개인 Mechanical Turk가 아닙니다. 내 대답의 맨 아래에 링크에서 복사해야하는'ltrim'과'rtrim' 함수가 있습니다. – selbie

0

으로 바꾸면 //으로 시작하는 줄을 찾으십시오. 따라서 int i = 0; // comment과 같은 줄은 코드 줄이 아닌 것으로 생각하지 않을 것입니다.

+0

이것은 작동하지 않습니다. 나는 당신의 제안을 시도하고 나의 산출물은 24 줄의 코드에서 30 줄의 코드로 갔다. 어딘가 덜 정확 해졌다. –

+0

@ n_alvarez2007 이것이 유일한 수정이라고 말하지는 않았습니다. – emlai

0
  1. empty()는 "no character at all"을 의미하지만 개미 공간 탭 만 포함하는 행을 필터링하려고합니다.
  2. 당신은, // (예를 int i; // loop index에 대한 포함 라인의 코드가 너무 잘못된 결과를 얻을 수를 필터링 할 수

에 될 일을하는 확실한 방법 :.

  1. 스트립 의견을
  2. 스트립 공백

하고 나머지 라인이 비어 있거나하지 않을 경우 다음을 참조하십시오.

C/C++에서의 문자열 처리는 애처롭기 때문에 문자열의 양쪽 끝에서 공백을 제거하는 데 필요한 코드를 작성 (또는 복사)해야하는 1.000.000 번째의 가난한 사람이됩니다.

btw. filename을 호출하면 현재 줄을 유지하기로되어있는 변수가 바나나 과수원에서 바로 가기가 아닙니다.