#include <iostream>
#include <fstream>
#include <iterator>
#include <string>
#include <vector>
#define SEP "\t"
class Line;
std::istream& operator >> (std::istream& is, Line & line);
std::ostream& operator << (std::ostream& os, Line const & line);
class Line
{
private:
friend std::istream& operator >> (std::istream& is, Line & line);
friend std::ostream& operator << (std::ostream& os, Line const & line);
std::string line_;
};
inline std::istream& operator >>(std::istream& is, Line & line)
{
return std::getline(is, line.line_);
}
inline std::ostream& operator << (std::ostream& os, Line const & line)
{
return os << line.line_;
}
int main(int argc, char** argv)
{
std::vector< std::ifstream > fs;
for(int i = 1; i < argc; ++i)
{
fs.push_back(std::ifstream(argv[i]));
}
std::istream_iterator<Line> end;
std::vector<std::istream_iterator<Line> > iters;
for(int i = 1; i < argc; ++i)
{
iters.push_back(std::istream_iterator<Line>(fs[i-1]));
}
bool done = true;
for(int i = 1; i < argc; ++i)
{
if(iters[i-1] != end) done = false;
}
while(!done)
{
done = true;
for(int i = 1; i < argc; ++i)
{
if(i > 1)
{
std::cout << SEP;
}
if(iters[i-1] != end)
{
std::cout << *(iters[i-1]);
++iters[i-1];
if(iters[i-1] != end) done = false;
}
else
{
std::cout << "place_holder";
}
}
std::cout << std::endl;
}
return 0;
}
Usage:
paste.exe file1.txt file2.txt ... filen.txt