Чтение строки из файла, используя стиль потока - PullRequest
3 голосов
/ 15 января 2010

У меня есть простой текстовый файл со следующим содержимым

word1 word2

Мне нужно прочитать его первую строку в моем приложении C ++.Следующий код работает, ...

std::string result;
std::ifstream f( "file.txt" );
f >> result;

... но result переменная будет равна "word1".Оно должно быть равно «word1 word2» (первая строка текстового файла). Да, я знаю, что могу использовать функцию readline (f, result), но есть ли способ сделать то же самое, используя стиль >>.Это может быть намного красивее.Возможно, некоторые манипуляторы, о которых я не знаю, будут здесь полезны?

Ответы [ 3 ]

4 голосов
/ 15 января 2010

Да, определить класс строки и определить оператор >> для этого класса.

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


struct Line
{
    std::string line;

    // Add an operator to convert into a string.
    // This allows you to use an object of type line anywhere that a std::string
    // could be used (unless the constructor is marked explicit).
    // This method basically converts the line into a string.
    operator std::string() {return line;}
};

std::istream& operator>>(std::istream& str,Line& line)
{
    return std::getline(str,line.line);
}
std::ostream& operator<<(std::ostream& str,Line const& line)
{
    return str << line.line;
}

void printLine(std::string const& line)
{
    std::cout << "Print Srting: " << line << "\n";
}

int main()
{
    Line    aLine;
    std::ifstream f( "file.txt" );
    f >> aLine;

    std::cout << "Line: " << aLine << "\n";
   printLine(aLine);
}
2 голосов
/ 15 января 2010

Нет, нет. Используйте getline(f, result) для чтения строки.

0 голосов
/ 15 января 2010

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

...