计算c ++中代码中的特定内容

时间:2010-04-04 14:59:56

标签: c++ cloc

任何人都可以帮助我让这更普遍,更专业吗?

#include <fstream>
#include <iostream>
#include <string>
#include <vector>

using namespace std;


int main()
{
 // open text file for input: 

 string file_name;

 cout << "please enter file name: ";
 cin  >> file_name;

 // associate the input file stream with a text file

 ifstream infile(file_name.c_str());

 // error checking for a valid filename

 if ( !infile )
    {
  cerr << "Unable to open file "
    << file_name << " -- quitting!\n";
  return( -1 );
    }
  else cout << "\n";

 // some data structures to perform the function

 vector<string> lines_of_text;
 string textline;

 // read in text file, line by 

 while (getline( infile, textline, '\n' ))
 {
  // add the new element to the vector

  lines_of_text.push_back( textline );

  // print the 'back' vector element - see the STL documentation

  cout << lines_of_text.back() << "\n";
 }

 cout<<"OUTPUT BEGINS HERE:  "<<endl<<endl;
cout<<"the total capacity of vector: lines_of_text is: "<<lines_of_text.capacity()<<endl;

int PLOC = (lines_of_text.size()+1);
int numbComments =0;
int numbClasses =0;

cout<<"\nThe total number of physical lines of code is: "<<PLOC<<endl;


for (int i=0; i<(PLOC-1); i++)

//reads through each part of the vector string line-by-line and triggers if the 

//it registers the "//" which will output a number lower than 100 (since no line is 100 char long and if the function does not 
//register that character within the string, it outputs a public status constant that is found in the class string and has a huge value
//alot more than 100.


{
string temp(lines_of_text [i]);
if (temp.find("//")<100)
numbComments +=1;
}
cout<<"The total number of comment lines is: "<<numbComments<<endl;

for (int j=0; j<(PLOC-1); j++)
{
string temp(lines_of_text [j]);
if (temp.find("};")<100)
numbClasses +=1;
}
cout<<"The total number of classes is: "<<numbClasses<<endl;

5 个答案:

答案 0 :(得分:4)

正确格式化代码,使用一致的样式和命名法,抛出完全冗余的注释和空行。结果代码应该没问题。或者“亲”。

在这里,我采用了efford(以及一些纯粹主观的风格):

请注意,输出实际上是错误(只需在程序代码上运行它就可以看到......)。

#include <fstream>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    string file_name;

    cout << "please enter file name: ";
    cin  >> file_name;

    ifstream infile(file_name.c_str());

    if (not infile) {
        cerr << "Unable to open file " << file_name << " -- quitting!" << endl;
        return -1;
    }
    else cout << endl;

    vector<string> lines_of_text;
    string textline;

    while (getline(infile, textline)) {
        lines_of_text.push_back(textline);
        cout << lines_of_text.back() << endl;
    }

    cout << "OUTPUT BEGINS HERE:  " << endl << endl;
    cout << "the total capacity of vector: lines_of_text is: "
         << lines_of_text.capacity() << endl << endl;

    int ploc = lines_of_text.size() + 1;

    cout << "The total number of physical lines of code is: " << ploc << endl;

    // Look for comments `//` and count them.
    int num_comments = 0;
    for (vector<string>::iterator i = lines_of_text.begin();
            i != lines_of_text.end();
            ++i) {
        if (i->find("//") != string::npos)
            ++num_comments;
    }

    cout << "The total number of comment lines is: " << num_comments << endl;

    // Same for number of classes ...
}

答案 1 :(得分:3)

我不确定你在问什么,但我可以指出一些可以在这段代码中改进的东西。我会专注于实际的陈述,并将风格评论留给其他人。

  • cin >> file_name;
    要处理带空格的文件名,最好写一下 getline(cin, file_name);

  • int PLOC = (lines_of_text.size()+1);
    为什么你声称还有一条线比实际线还多?

  • if (temp.find("//")<100)
    用一些复杂的评论来解释这个。更好写 if (temp.find("//")<temp.npos)
    在所有行长度上正常工作。

  • cout<<"The total number of comment lines is: "<<numbComments<<endl;
    实际上,您计算了行尾注释的数量。我不会在声明结尾处发表评论“评论专栏”。

  • 您不会计算/* */样式评论。

  • 将课程数量计为};?真? struct s,enum和简单的多余分号怎么样?只需计算class关键字的出现次数即可。它的左右应该没有字母数字字符或下划线。

答案 2 :(得分:2)

  1. 使用适当的缩进,您的代码很难以当前形式阅读。 Here是样式列表。
  2. 如果可能,请选择++variable代替variable += 1; ++运算符存在是有原因的。
  3. 在编码风格上保持一致。如果你要在cout<<之间留出空格,那么函数参数和函数parantheses就会这样做,否则不会,但要保持一致。为您的变量选择一个命名约定并坚持下去。您可以在Google上找到很多关于样式的内容,例如herehere
  4. 不要只使用整个std命名空间。用户using std::cout;或前缀cout
  5. 的所有std::语句
  6. 避免不必要的评论。每个人都知道ifstream infile(file_name.c_str());做了什么,例如,我不知道你的程序整体上做了什么,因为我并不真正关心它是由于缩进而做了什么。这是一个简短的程序,所以不是解释每个语句本身,为什么不解释程序的目的是什么,以及如何使用它?
  7. 这些都是风格点。假设您的目标是计算注释和类,则您的程序无法以当前形式运行。这样做比你考虑的困难得多。如果我有“};”该怎么办?作为字符串的一部分,例如?如果我在字符串中有注释怎么办?

答案 3 :(得分:0)

不要导入整个std命名空间,只需要导入它:

using std::string;

使用一致的命名约定:决定您是首选name_for_a_variable还是nameforavariable还是nameForAVariable。并使用有意义的名称:numbComments使我与numberOfCommentsnumCommentscommentCount完全不同。

如果您的原始代码如下所示,我强烈建议您选择一种一致的缩进样式:

if ( ... )
    {
    ...
    }

if ( ... )
{
    ...
}

bot 在同一个源文件中。

同时删除无用的评论,例如

// add the new element to the vector

这是“仅”关于代码的可读性,甚至没有触及它的功能......(正如其他人已经指出的那样,这是不正确的)。请注意,任何一段代码的读取次数可能比编辑的次数多。我相当肯定,如果你需要在几个月之后阅读它,你将无法阅读(并理解)这种形状的代码。

答案 4 :(得分:0)

“更专业”根本就不会这样做。使用现有的SLOC计数器,因此不要重新发明轮子。

本讨论列出了几个: http://discuss.techinterview.org/default.asp?joel.3.207012.14

另一个提示:不要使用“temp.find(”};})&lt; 100)“,使用”temp.find(“};”)!= temp.npos;“

编辑:s / end()/ npos。啊。