我的软件工程课程的任务正在推动我的香蕉。我被要求设计一个行计数器,它只计算任何给定文件的逻辑代码行。它必须省略空行和注释。
我得到的代码几乎可以工作,除非它将行号计数为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 :(得分: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)
//
的行中包含代码(例如int i; // loop index
,因此将其过滤掉会得到错误的结果。做事的可靠方法是:
然后查看剩余的行是否为空。
C / C ++中的字符串处理是可悲的,所以你将成为强制写入(或复制)字符串两端空格所需代码的第1000个穷人。
顺便说一句。调用filename
一个应该保存当前行的变量不是香蕉树林中的捷径。