任何人都可以帮助我让这更普遍,更专业吗?
#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;
答案 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)
++variable
代替variable += 1
; ++
运算符存在是有原因的。cout
和<<
之间留出空格,那么函数参数和函数parantheses就会这样做,否则不会,但要保持一致。为您的变量选择一个命名约定并坚持下去。您可以在Google上找到很多关于样式的内容,例如here和here。std
命名空间。用户using std::cout;
或前缀cout
std::
语句
ifstream infile(file_name.c_str());
做了什么,例如,我不知道你的程序整体上做了什么,因为我并不真正关心它是由于缩进而做了什么。这是一个简短的程序,所以不是解释每个语句本身,为什么不解释程序的目的是什么,以及如何使用它?这些都是风格点。假设您的目标是计算注释和类,则您的程序无法以当前形式运行。这样做比你考虑的困难得多。如果我有“};”该怎么办?作为字符串的一部分,例如?如果我在字符串中有注释怎么办?
答案 3 :(得分:0)
不要导入整个std
命名空间,只需要导入它:
using std::string;
使用一致的命名约定:决定您是首选name_for_a_variable
还是nameforavariable
还是nameForAVariable
。并使用有意义的名称:numbComments
使我与numberOfComments
,numComments
或commentCount
完全不同。
如果您的原始代码如下所示,我强烈建议您选择一种一致的缩进样式:
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。啊。