2016-02-18 8 views
-1

Моя цель состоит в том, чтобы читать из входного файла и подсчитывать количество строк, имеющих по крайней мере 1 строчную букву и 1 цифру. Я уже решил остальную часть моего кода, которая не учитывала все строчные, прописные, цифры, символы и слова. Я также прочитал из входного файла и перепутал строки слово за словом. Я не могу понять, почему код подсчитывает 8 строк, когда есть только 7 с 1 строчными буквами и 1 цифрой. При использовании getline() для всех других циклов у меня не было проблем. Я не хочу, чтобы кто-то написал код для меня. Я просто хотел бы объяснить, почему это происходит, если это возможно?Код, читающий дополнительную строку в моей петле?

Моего входной файл содержит:

This is a test file for hw3 
How many Uppercase letters are in this f1le? 
How many Lowercase letters are in this F1le? 
H0W mAnY dIg1ts ar3 1N in this FILe? 
Turn the 1npU7 N4m3 int0 its reverse 
reverse the Lines to their opp05173 coutnerpart 
find tOTal NumbEr of characTer5 in F1le 
THIS IS A TEST LINE 

Моего код этого раздела:

inFile.clear(); 
    inFile.seekg(0, inFile.beg); 

    while(getline(inFile, line)){ 
     wordInput.str(line); 
     wordInput.clear(); 
     wordInput.seekg(0); 

    while(wordInput.get(c)){ 
     if(islower(c)){ 
      lowerCase++; 
     } 
     else if(isdigit(c)){ 
      digit++; 
     } 
    } 

     if(lowerCase >= 1 && digit >= 1){ 
      lineCount++; 
     } 

    }  

    cout << lineCount << endl; 

    return 0; 
} 

Я инициализируюсь все мои Int переменных 0, а сверху и я объявил мой sstream переменные также. Мои библиотеки включают в себя <sstream><fstream><string><iostream> и <algorithm> (который использовался для предыдущих частей.

Выход я получаю

8 

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

+3

В начале цикла, сразу после того, как вы прочитали строку, напечатайте «digit» и «lowerCase»: вы обнаружите, что они не сбрасываются в '0', поэтому по существу они всегда'> = Даже если на линии нет цифр. – Tas

+0

А, я вижу. Это имеет смысл. Мне нужно было сбросить значение в цикле. Это сработало отлично. Большое спасибо. Я действительно нервничал. – ryanpback

ответ

1

Вы ясно дали понять, что что вы инициализируете все переменные int до 0, что отлично; Однако, давайте посмотрим на код (отформатирован так отступы имеет больше смысла):

// read line from file 
while(getline(inFile, line)) 
{ 
    wordInput.str(line); 
    wordInput.clear(); 
    wordInput.seekg(0); 

    // read character 
    while(wordInput.get(c)) 
    { 
     if(islower(c)) 
     { 
      lowerCase++; 
     } 
     else if(isdigit(c)) 
     { 
      digit++; 
     } 
    } 

    if(lowerCase >= 1 && digit >= 1){ 
     lineCount++; 
    } 

} 

Здесь вы читаете строку, и пройти через все символы на этой строке, и если вы найдете символ нижнего регистра, или цифра, вы увеличиваете переменную. Что происходит, когда вы читаете следующую строку? Вы не сбросили эти переменные обратно до 0, поэтому, читая следующую строку, они оба были выше 1.

Вам необходимо следующее:

while(getline(inFile, line)) 
{ 
    wordInput.str(line); 
    wordInput.clear(); 
    wordInput.seekg(0); 

    // We're about to start reading this line, so obviously we haven't found any yet 
    digit = 0; 
    lowerCase = 0; 

еще лучше, вы, вероятно, может просто объявить эти переменные в пределах считывания строкиwhile цикл:

while(getline(inFile, line)) 
{ 
    int digit = 0; 
    int lowerCase = 0; 

Хотя вы не учили используйте отладчик, отличный способ отладки - с операциями cout. Помещенный некоторые операторы печати, чтобы определить, в чем все ваши переменные в любой момент времени:

while(getline(inFile, line)) 
{ 
    std::cout << "read line " << line << std::endl; 
    while(wordInput.get(c)) 
    { 
     std::cout << "lowercase found so far: " << lowerCase << std::endl; 
     std::cout << "digits found so far: " << digit << std::endl; 
     if(islower(c)) 
     { 
      std::cout << "lowercase character found: " << c << std::endl; 
      lowerCase++; 
     } 
     else if(isdigit(c)) 
     { 
      std::cout << "digit found: " << c << std::endl; 
      digit++; 
     } 
    } 

    if(lowerCase >= 1 && digit >= 1) 
    { 
     std::cout << "found a lowercase character (" << lowerCase << ") or a digit (" << digit << ")" << std::endl; 
     lineCount++; 
    } 

} 
+0

Большое спасибо за ответ! Я очень ценю время, которое вы приняли, чтобы объяснить это. Добавляя lowerCase = 0 и цифры = 0 в read в цикле while, он работает как шарм. Я не думал, что это проблема. Я продолжу использовать мои строки, чтобы проверить, что происходит. Хотел бы я дать вам больше, чем просто голосование и чек! – ryanpback

0

Это было некоторое время, так как я закодированы в C++. Есть и другие способы отладки, чем программа отладчика.

Я бы добавил cout << line << endl; в ваш первый цикл. Таким образом, вы можете выводить, как читаются строки, и если они повторяются. Также проверьте свои функции islower(char) и isdigit(char), чтобы убедиться, что они читают соответствующие диапазоны ascii.