2014-10-14 3 views
1

Я работаю над функцией, которая читается в строках файла до тех пор, пока в файле не будет достигнута строка «XXX», и счетчик отслеживает, сколько строк было прочитано. Затем программа подсчитывает оставшееся количество строк в файле. Я использую оператор if, чтобы определить, когда нужно разбить цикл while (когда чтение строки равно «XXX»), и условие не выполняется. Даже когда строка == «XXX», оператор else все равно будет работать. Что случилось с моим кодом? Благодаря!Оператор C++ if, сравнивающий строки, не работающие

#include <string> 
#include <iostream> 
#include <fstream> 

using std::string; 
using std::endl; 
using std::cout; 
using std::ifstream; 

int main() 
{ 
    //Main function 
} 

void read_file(string input_file_name) 
{ 
    string i_filename = input_file_name; 
    ifstream infile; 
    infile.open (i_filename); 
    string line; 
    int num_of_terms1 = 0; 
    int num_of_terms2 = 0; 

    if (!infile) 
    { 
     cout << "Your input file could not be opened."<<endl; 
    } 
    else 
    { 
     while (!infile.eof()) 
     { 
      getline(infile, line); 
      cout << line << endl; 

      if (line == "XXX") 
      { 
       break; 
      } 
      else 
      { 
       cout << line << endl; 
       num_of_terms1++; 
      } 
     } 
     while (!infile.eof()) 
     { 
      getline(infile, line); 
      cout << line << endl; 
      num_of_terms2++; 
     } 
    } 
cout << "Terms 1: "<<num_of_terms1 <<endl; 
cout << "Terms 2: "<< num_of_terms2 <<endl; 
infile.close(); 
} 

Вот входной пример файла, inputfile.txt:

-2 3 
4 2 
XXX 
-2 3 

Заранее спасибо за помощь!

+0

Как выглядит вывод? – maxywb

+1

Почему бы вам не выполнить некоторую отладку. Начните с проверки значений 'line' на каждой итерации цикла. Ваша настоящая проблема заключается не в том, что программа не работает, а в том, что вы еще не научились отлаживать. Как только вы это сделаете, вы сможете решить все эти проблемы самостоятельно. –

+0

Почему вы думаете, что «Даже когда строка ==« XXX », оператор else все равно будет работать»? – Slava

ответ

0

Я тестировал этот код на www.compileonline.com и повторил ваши выводы.

В этой среде каждая строка, считанная из файла, имеет символ \ r на конце.

Когда я сменил завершающую строку на if (line == "XXX\r"), код работал должным образом.

Кажется, что строки вашего входного файла завершены «\ r \ n», что является нормой для окон, но текстовые файлы unix обычно заканчиваются на «\ n».

+0

Спасибо! Я пробовал с «XXX \ n», но я не понимал, что «\ r» сделает это. Я очень ценю помощь. –

+1

Я чувствую, что важно понимать, что здесь происходит. Вложение '\ r' в тестовую строку сделает эту работу над окнами, но не в unix. Лучше очистить любые контрольные символы от строки, которую вы прочитали, перед ее тестированием. –

1

Прежде всего, вы должны прочитать: Why is iostream::eof inside a loop condition considered wrong?

Второй отладочных линии:

cout << line << endl; 

точно так же в обоих случаях - вы внутри другое заявление или вы рассчитываете num_of_terms2 и это сбивает с толку. Измените их, чтобы вы могли видеть, какой из них напечатан.

После устранения проблемы, что вы увидите, что «другое заявление не будет по-прежнему работать»

0

Как я уже говорил в комментариях, у вас есть 2 cout заявления вы должны проверить, какой из них является печать XXX. Если ни один из них не так, то это, скорее всего, проблема заключается в том, что есть возврат каретки в строке, вы можете проверить это другой случай с:

cout << line << endl; // print is here 

if (line == "XXX\r") 
{ 
    break; 
} 
else 
{ 
    cout << line << endl; // print is here 
    num_of_terms1++; 
} 
+0

Это работает! Спасибо! –

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