#include #include #include #include #include #include template Cell add_data(Cell &output, std::ifstream* in) { column_type v; (*in) >> v; if (!(*in)) { return output; } if (! in->eof() ) { dim_vector d = output.dims(); Array p(d.length(), 0); p(d.length()-1) = d(d.length()-1); d(d.length()-1)++; output.resize(d); output = output.concat(octave_value(v), p); } return output; } DEFUN_DLD(tread, args, , "Quick hack for text input, see `textread' for more detail.\n\n\ Usage: tread(filename, format)\n\n\ where format can include '%s' for string,\n\ '%d' for double,\n\ '%*' to ignore column.") { octave_value_list retval; if (args.length() != 2) { print_usage("tread"); return retval; } std::string filename = args(0).string_value(); std::string format = args(1).string_value(); if (error_state) { error("Invalid argument specified"); print_usage("tread"); return retval; } std::istringstream format_s(format); std::vector columns; while (format_s && !format_s.eof()) { std::string p; format_s >> p; columns.push_back(p); } std::ifstream data(filename.c_str()); if (!data) { error("tread: couldn't open data file %s", filename.c_str()); return retval; } if (data) { data >> std::skipws; } std::vector output(columns.size()); for (int i = 0; i < columns.size(); i++) { output[i] = Cell(1,0); } std::string s; double d; char buf[1024]; long unsigned int line = 0; try { while (data) { for (int i = 0; i < columns.size(); i++) { if (columns[i] == "%d") { output[i] = add_data(output[i], &data); } else if (columns[i] == "%s") { output[i] = add_data(output[i], &data); } else { data >> s; break; } } std::cout << line++ << "\r" << std::flush; data.getline(buf, 1024); // ensure we've reached EOL } } catch (std::exception e) { error("tread: cannot read from %s", filename.c_str()); return retval; } for (int i = 0; i < columns.size(); i++) { retval.append(octave_value(output[i])); } data.close(); return retval; }