在C ++中跳过以//开头的注释行

时间:2015-02-07 06:43:27

标签: c++ counter lines-of-code

我的软件工程课程的任务正在推动我的香蕉。我被要求设计一个行计数器,它只计算任何给定文件的逻辑代码行。它必须省略空行和注释。

我得到的代码几乎可以工作,除非它将行号计数为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行逻辑代码。帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

为什么不添加cout << filename << '\n';等打印声明来识别它识别的行?我怀疑你会看到一些空白。

我怀疑你需要修剪字符串中的空格。您可能有一些空行包含空格或制表符。因此,就str :: empty而言,它们在技术上并不是空的。

此外,通过修剪并修复我在您的代码中看到的另一个错误,包括处理&#39; //&#39;作为评论。

因此,它变成了修剪的简单修复。

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的实现。

答案 1 :(得分:0)

filename.find("//") == true替换为filename.find("//") == 0以查找以//开头的行,以便它不会认为像int i = 0; // comment这样的行是非代码行。

答案 2 :(得分:0)

  1. empty()表示&#34;根本没有字符&#34;,而您还想过滤掉仅包含空格的标签的行。
  2. 您可能在包含//的行中包含代码(例如int i; // loop index,因此将其过滤掉会得到错误的结果。
  3. 做事的可靠方法是:

    1. 剥离评论
    2. 剥离空白
    3. 然后查看剩余的行是否为空。

      C / C ++中的字符串处理是可悲的,所以你将成为强制写入(或复制)字符串两端空格所需代码的第1000个穷人。

      顺便说一句。调用filename一个应该保存当前行的变量不是香蕉树林中的捷径。