2012-04-21 7 views
2

У меня есть вопрос, что делать с "\n" или "\r\n" и т. Д. При чтении текстового файла на C++. Проблема возникает, когда я делаю следующую последовательность операций:читать текстовый файл в C++

int k; 
f>>k; 
string line; 
getline(f,line); 

для входного файла с чем-то вроде

1 
abc 

Я должен поставить f.get() для того, чтобы считывать окончание "\n" после f>>k. Я даже должен сделать f.get() дважды, если у меня есть "\r\n".

Что такое элегантный способ чтения файла, подобного этому, если я смешиваю >> с getline?

спасибо.

Редактировать Кроме того, интересно, если есть удобный способ для автоматического обнаружения данного файла имеет конца-строки символ "\n" или "\r\n".

ответ

4

Вам нужно немного поиграть >> и getline, чтобы работать счастливо вместе. В общем, чтение чего-то из потока с помощью оператора >> не будет отбрасывать любые последующие whitspaces (новые строковые символы).

Обычный подход к решению этой проблемы с помощью функции istream::ignore, следующей за >>, - это указание отказаться от каждого символа до следующей строки новой строки. (Только полезно, если вы действительно хотите отбросить каждый символ до новой строки).

например.

#include <iostream> 
#include <string> 
#include <limits> 

int main() 
{ 
    int n; 
    std::string s; 
    std::cout << "type a number: "; 
    std::cin >> n; 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    std::cout << "type a string: "; 
    std::getline(std::cin, s); 
    std::cout << s << " " << n << std::endl; 
} 

редактировать (я понимаю, вы упомянули файлы в этом вопросе, но, надеюсь, это само собой разумеется, что зЬй :: CIN полностью взаимозаменяемы с ifstream)

+1

Спасибо! Пожалуйста, см. Мое редактирование: так, как автоматически писать оператор 'std :: cin.ignore (std :: numeric_limits :: max(), '\ n');' иногда используется «\ r \ n "в качестве конечных символов? –

+0

@QiangLi игнорирует ** все ** символы до и включая символ '\ n'. неважно, каковы эти символы, нет ничего особенного в том, чтобы поставить перед ним '\ r', поэтому« \ r \ n »будет обрабатываться так же, как« \ n »или« helloworld \ t \ n », , –

0

Совершенно иной подход был бы предварительно -произведите файл данных с помощью tr (при условии, что вы используете Linux), чтобы удалить \r, а затем используйте getline().

+0

нет, я не хочу изменять входной файл. –

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