2013-06-25 2 views
2

Я хочу читать входы от std::cin или std::ifstream, которые определяются из командной строки. Команда выглядит как ./run 1 или ./run 2. Прямо сейчас, я должен написать две почти похожие функции, основанные на режиме чтения.Пытается переключиться между std :: cout и std :: ifstream

void read1() 
{ 
    int a, b; 
    while (std::cin >> a >> b) { 
    // do something 
    } 
} 

или

void read2() 
{ 
    int a, b; 
    std::ifstream fin("file.txt"); 
    while (fin >> a >> b) { 
    // do something 
    } 
} 

Для больших петель трудно поддерживать обе функции, так как часть цикла является общим и единственным отличием является входным источником.

Как интегрировать две функции?

ответ

8

std::cin и std::ifstream оба std::istream s, так что вы могли бы решить эту проблему с помощью функции, действует по ссылке std::istream. Это будет работать в std::cin, std::ifstream экземпляров, а также любые другие std::istream S:

void read(std::istream& input) 
{ 
    while (input >> a >> b) { .... } 
} 

затем переключают на стороне вызывающего абонента.

if (something) 
{ 
    read(std::cin); 
} else 
{ 
    isfream input(....); 
    read(input); 
} 
+0

Я думаю, вы должны указать, что это работает, потому как станд :: CIN и станд :: ifstream являются станд :: IStream – Antonio

+0

@Antonio Спасибо, сделано. – juanchopanza

0

как станд :: ifstream и станд :: КИН inputstreams, вы можете вызвать функцию с IStream в качестве аргумента