// Read in a sorted file row col value. Write it out as a DELIMITED file void MakeMatrix(std::string input_file_name, std::string output_file_name) { auto input_file = OpenReadFile(input_file_name); auto output_file = OpenWriteFile(output_file_name); LineBuf last_line; LineBuf cur_line; fscanf(input_file.get(), "%d %d ", &last_line.row, &last_line.col); ReadToEndl(&last_line.line[0], input_file.get()); NukeNl(&last_line.line[0]); while (!feof(input_file.get())) { fscanf(input_file.get(), "%d %d ", &cur_line.row, &cur_line.col); ReadToEndl(&cur_line.line[0], input_file.get()); NukeNl(&cur_line.line[0]); if (last_line.col != 0) { fputc(FILE_DELIMITER, output_file.get()); } fputs(last_line.line, output_file.get()); if (cur_line.row != last_line.row) { fputc('\n', output_file.get()); } last_line = cur_line; } // Remove if you don't want \n at the end of your file. fputc('\n', output_file.get()); }
// Read in a delimited file (trailing delimiters not allowed, \r not allowed) // write it out as transposed row col cell value. void Rewrite(std::string input_file_name, std::string output_file_name) { FileAsArray input_file(input_file_name); auto output_file = OpenWriteFile(output_file_name); int row = 0; int col = 0; int64_t file_length = input_file.Length(); int64_t cur_pos = 0; int64_t last_start = 0; int correct_row_count = 0; int processed_rows = 0; int64_t one_percent = file_length / 100; int64_t cur_percent = 0; while (cur_pos < file_length) { auto cur_char = input_file.Get(cur_pos); bool is_delimiter = cur_char == FILE_DELIMITER; bool is_newline = cur_char == '\n'; bool last_char_in_file = cur_pos == file_length - 1; if (is_delimiter || is_newline || last_char_in_file) { if (is_newline && input_file.Get(cur_pos - 1) == FILE_DELIMITER) { printf("Lines end in delimiter, not supported"); exit(-1); } if (is_newline && input_file.Get(cur_pos - 1) == '\r') { printf("\\r endlines not supported."); exit(-1); } fprintf(output_file.get(), "%d %d ", row, col); if (last_char_in_file) { cur_pos++; } input_file.WriteTo(last_start, cur_pos - last_start, output_file.get()); fputc('\n', output_file.get()); last_start = cur_pos + 1; // don't care about the delimiter. } if (is_delimiter) { // Each column becomes a row. row++; } if (is_newline) { if (cur_pos > cur_percent) { printf("%3.0f%%\n", 100 * (cur_percent / (double)file_length)); cur_percent += one_percent; } processed_rows++; col++; if (correct_row_count == 0) { correct_row_count = row; printf("Expect col count %d\n", row); } else if (correct_row_count != row) { printf("Row %d has wrong col count %d\n", processed_rows, row); // Nuke the file we were writing output_file = OpenWriteFile(output_file_name); exit(-1); } row = 0; } cur_pos++; } }
bool textfile_c::OpenWriteTextFile(char * aName) { return OpenWriteFile(aName); }