2014-01-27 5 views
-2

im, стремящееся подсчитать количество строк в коде, я понял, что мне нужно искать определенный символ из файла и увеличивать на единицу каждый раз, когда нашлось. Теперь у меня есть общий смысл, но им трудно понять, как читать каждую строку в файле. Я опубликовал то, что у меня есть. Любая помощь будет оцененаСоздание программы, которая читает, подсчитывает количество строк в файле C++

#include<fstream> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    ifstream readfile; 
    readfile.open("project1b.cbp"); 
    int number_of_lines=0; 
    char = ch; 
    while(ch !=EOF) 
    { 
     if(ch!='endl'||';') 
     number_of_lines++; 
    } 


    return 0; 
} 
+1

'while (std :: getline (string, file)) n_lines ++; '- btw, почему это помечено C? –

+1

Является ли эта часть упражнения? Если нет, я бы предложил взглянуть на http://www.dwheeler.com/sloccount/ – Martin

ответ

0

Вы можете использовать std::getline для получения каждой строки.

+0

Им нужны« строки кода » ». – juanchopanza

+0

Вы можете сделать si mple check для строки [0] и строки [1] для символов, которые вы ожидаете в комментариях по одной строке. – crnlx

2

Линия

if(ch!='endl'||';') 

НЕ делать то, что вы думаете. Вы проверяете, что ch не равно endl, или что ; есть. И так как ; всегда истинно (не ноль), у вас на самом деле нет очень полезного сравнения здесь.

Вы могли бы думать о

if(ch!='endl'|| ch!=';') 

Или что-то подобное. Не уверен, что вы пытаетесь достичь с помощью сравнения ...

Что касается другой части вопроса - вершина Google хита для «C++ прочитать файл построчно» получает Вас к следующему Stackoverflow ответа:

https://stackoverflow.com/a/7868998/1967396

Это все, что вам нужно.

Еще одна вещь - вам нужно более четко определить, что такое «строка кода». Является ли в принципе «любой возврат каретки или любая точка с запятой» новой линией? Как насчет точки с запятой, а затем новой строки? Как насчет линии с двумя точками с запятой (два оператора в одной строке)?

Для облегчения вашего мышления вам будет немного более загадочно. Я рекомендую разделить логику в

  1. Получить строку из файла
  2. Count запятая
  3. Если есть точка с запятой, есть что-нибудь еще отметить после них
  4. Решает, как считать этот

Заключительная мысль: единственная цитата ' ' используется для определения постоянной символа. Двойная кавычка " " используется для определения строковой константы. Конец строки обычно равен \n или \r; в C++ мы используем std::endl как способ написать это - но это не в кавычках. И когда вы используете namespace std, предположительно, вы можете просто написать endl, если вы имеете в виду '\n'. Но размещение одинарных кавычек вокруг меня смущает меня - и, вероятно, компилятор тоже.

+0

ах я вижу. то, что я пытаюсь получить, состоит в том, что если у меня есть один из этих символов в моей строке, он считается как строка и увеличивает количество счетчиков строк на единицу. – MoMo8

+2

@ user3006893 и что вы ожидаете от '' endl''? Вы даже прочитали какую-либо документацию? Это случайный многосимвольный строковый литерал, это не то, что вы получаете, когда достигаете конца строки (вы получаете '' \ n'' или '' \ r'', когда вы это делаете). –

0

Попробуйте это:

#include <fstream> 
#include <iostream> 
using namespace std; 

int main(int argc, char **argv){ 
    if(argc!=2){ 
    cout<<"Syntax: "<<argv[0]<<" <FILENAME>"<<endl; 
    return -1; 
    } 

    ifstream readfile(argv[1]); 
    if(!readfile.good()){ 
    cout<<"Failed to open file: '"<<argv[1]<<"'!"<<endl; 
    return -1; 
    } 

    int number_of_lines=0; 
    while(readfile.good()){ 
    char ch=readfile.get(); 
    if(ch=='\n'|| ch==';') 
     number_of_lines++; 
    } 

    cout<<"Number of lines: "<<number_of_lines<<endl; 

    return 0; 
} 

Некоторые отличия от вашего кода.

  • Я использую argc and argv, чтобы пользователь мог указать имя файла в командной строке.
  • Загрузите файл с ifstream readfile(argv[1]). Это соответствует схеме RAII (Resource Acquistion is Initialization), обычно используемой в C++. Я не использую оператор close(), потому что ifstream выйдет за рамки и автоматически очистится. Использование RAII делает ваш код более чистым и менее подверженным ошибкам.
  • Я использую get() для получения новых символов из потока символов. Этого не хватало в вашем коде.
  • Конец строки происходит, когда символ \n (новая строка) является тем, на который мы смотрим сейчас, или если мы смотрим на символ ;. endl не является символьной константой - это скорее манипулятор потока, поэтому вы не можете использовать его так, как вы делаете, и не делать сравнения такого рода в целом.
  • Обратите внимание, что оператор или (||) разделяет два полных логических оператора, способ их использования ((ch!='endl'||';')) не работает так, как вы думаете.
  • Я предпочитаю использовать K&R style брелок, а не ваш язычник Allman/GNU style. (Это что-то шутка, но я рекомендую вам попробовать несколько различных стилей и найти тот, который подходит для вас. Я предпочитаю K & R для SO, так как код становится более компактным.

Вы должны спросить себя, если это действительно так, как вы хотите подсчитать строки кода. Например, for for (for(int i=0;i<N;++i)) будет выглядеть как три строки кода, используя вашу метрику.

+0

Благодарим вас за помощь. программа, которую вы предоставили, дала мне толчок в правильном направлении. Я действительно не знаю стиль K & R, поскольку я - студент, которого мы в основном оставили в определенном смысле для наших собственных устройств. Но я как бы взял стиль, о котором вы говорили, из-за того, что мне кажется наиболее логичным. Я вижу, что все мои фигурные скобки не должны беспокоиться о том, что они отсутствуют. Я думаю, что это было то, что я разработал самостоятельно. У меня есть вопрос о том, есть ли у вас советы по тому, чтобы стать лучшим программистом, как вы. Мне иногда кажется, что моя школа подвела меня. Или это общее для нобов? – MoMo8

+0

Я чувствую, что мои программы, которые я заставляю их работать, но они очень короткие. Это может быть просто свидетельством моего стиля мышления и думать о том, чтобы сделать все максимально простым? – MoMo8

+0

Полезно разработать эстетическое представление о том, как выглядит ваш код: отступы и скобки. Мне нравится стиль K & R, потому что я редко забываю скобки и поэтому хочу, чтобы они были ненавязчивыми. Когда я начал, я хотел узнать, как программировать игры. Выясните, как закодировать игру «Угадай номер», попробуйте ввести код [Hunt the Wumpus] (https://en.wikipedia.org/wiki/Hunt_the_Wumpus). Всегда начинайте с простой версии игры, затем добавляйте элементы, чтобы сделать ее более сложной. – Richard

Смежные вопросы