2015-12-05 2 views
0

Для моей программы мы должны прочитать текстовый файл и распечатать его на экране. В текстовом файле сообщение может выглядеть так:Пропуск строки с getfile

#email 
mailservice 
birdman 
Intro 
Hello Birdman! Welcome! 
#email 
Frank 
birdman 
Hello 
Hello Birdman, how are you? 

мне нужно пропустить через #email так, что он печатает как:

From: mailservice 
To: birdman 
Subject: Intro 
Message: Birdman! Welcome! 

From: Frank 
To: birdman 
Subject: Hello 
Message:Hello Birdman, how are you? 

Это код, который у меня есть:

std::string filename1 = GetInboxFile(username); 
std::ifstream fin(filename1); 
std::string word; 
std::cout << "\n"; 

std::string formatted = FormatEmailString("From: ", "To: ", "Subject: ", "Message: "); 
//FormatEmailString is a function 

std::cout << formatted; 

while (fin.eof() == false) 
{ 

    std::string line = GetLine(fin); 

    if (fin.eof() == false) 
    { 

     std::cout << line << std::endl; 

    }//END IF STATEMENT 

}//END WHILE LOOP 

std::cout << std::endl; 
fin.close(); 

ответ

1
while (fin) 
{ 
    std::string line = GetLine(fin); 

    if (fin) // @DietmarKühl: checking if the input was successful 
    { 

     // if (line.find("#email") != std::string::npos) 
     if(line == "#email\n") 
     { 
      line = "\n"; // you want a empty line instead 
      // continue; // you could use continue to simply skip it 
     } 

     std::cout << line << std::endl;  
    } 
} 
+2

Использование 'stream.eof()' как единственного условия всегда неверно. Вам всегда нужно проверить показания _after_, чтобы определить, было ли чтение успешным. –

+0

Кажется, что код по-прежнему использует 'fin.eof()' для проверки, а не проверки того, был ли вход успешным, который выполняется с помощью 'if (fin)'. Хотя строка чтения не имеет причин сбоя, кроме конца файла, другие операции ввода могут завершиться неудачей, не устанавливая значение 'fin.eof()' на 'true'. –

+0

Хорошо, я понимаю. Теперь нормально? – CoderPi

1

Если входной файл содержит только действительные данные, и нам не нужно его проверять, мы можем получить правильный вывод следующим образом:

while (getline(fin, lineFromFile)) { 

    if (lineFromFile.find("#email") < 40000) { 
     getline(fin, lineFromFile); 
     cout<<"From: "<<lineFromFile<<endl; 
     getline(fin, lineFromFile); 
     cout<<"To: "<<lineFromFile<<endl; 
     getline(fin, lineFromFile); 
     cout<<"Subject: "<<lineFromFile<<endl; 
     getline(fin, lineFromFile); 
     cout<<"Message: "<<lineFromFile<<endl<<endl; 
    } 
} 
+1

Использование 'stream.eof()' как единственного условия всегда неверно. Вам всегда нужно проверить показания _after_, чтобы определить, было ли чтение успешным. –

+0

Я сказал, что если входной файл содержит только действительные данные ... – Evgeniy331

+0

Даже если он содержит только достоверные данные, использование 'eof()' - неправильный подход. Примечательно, что, когда данных больше нет, 'eof()' скорее всего будет 'false' перед чтением (когда файл заканчивается символом' '\ n''). Вам нужно проверить состояние потока _after_, например, используя 'while (std :: getline (in, linFromFile))'. –

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