// 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++;
	}
}
Esempio n. 3
0
bool textfile_c::OpenWriteTextFile(char * aName) {
  return OpenWriteFile(aName);
}