У меня есть задание для моего класса Software Engineering, которое сводит меня с ума. Меня попросили спроектировать счетчик строк, который учитывает только логические строки кода для любого файла. В нем не должно быть пустых строк и комментариев.
У меня код работает достаточно хорошо, за исключением того, что он пересчитывает номера строк на 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 строки логического кода. Помощь будет оценена.
Почему бы вам не добавить заявление для печати, такие как cout << filename << '\n';
определить линии, которые он идентифицирует? Я подозреваю, что вы увидите несколько пустых строк.
Я подозреваю, что вам нужно вырезать пробелы из ваших строк. Возможно, у вас есть несколько пустых строк, которые содержат пробелы или табуляции. Следовательно, они не являются технически пустыми в отношении 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 на этот другой ТАК ответ здесь.
замещать filename.find("//") == true
с filename.find("//") == 0
чтобы найти строки, которые начинаются с //
, так что он не будет думать, что такие строки, как int i = 0; // comment
не кодовые строки.
//
(например int i; // loop index
поэтому их фильтрация даст неправильные результаты.Верный способ сделать что-то будет:
а затем посмотреть, если оставшаяся строка пуста или нет.
Обработка строк в C / C ++ жалкая, поэтому вы будете 1.000.000-м бедным парнем, вынужденным писать (или копировать) код, необходимый для обрезки пробелов на обоих концах строки.
Кстати. призвание filename
переменная, которая должна содержать текущую строку, не является ярлыком из банановой рощи.