counter — Пропуск строк комментария, начинающихся с // в переполнении стека

У меня есть задание для моего класса 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 строки логического кода. Помощь будет оценена.

1

Решение

Почему бы вам не добавить заявление для печати, такие как 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 на этот другой ТАК ответ здесь.

1

Другие решения

замещать filename.find("//") == true с filename.find("//") == 0 чтобы найти строки, которые начинаются с //, так что он не будет думать, что такие строки, как int i = 0; // comment не кодовые строки.

0

  1. empty () означает «вообще без символа», в то время как вы также хотите отфильтровать строки, которые содержат только пробелы и вкладки.
  2. у вас может быть код в строках, которые содержат // (например int i; // loop indexпоэтому их фильтрация даст неправильные результаты.

Верный способ сделать что-то будет:

  1. раздеть комментарии
  2. лишить пробелов

а затем посмотреть, если оставшаяся строка пуста или нет.

Обработка строк в C / C ++ жалкая, поэтому вы будете 1.000.000-м бедным парнем, вынужденным писать (или копировать) код, необходимый для обрезки пробелов на обоих концах строки.

Кстати. призвание filename переменная, которая должна содержать текущую строку, не является ярлыком из банановой рощи.

0
По вопросам рекламы [email protected]