一、 换行格式问题
在与同学进行测试的过程中发现,一个文件的换行格式可以有多种,即CRLF,CR,LF三种,而我在进行输入输出的时候使用ReadFile和WriteFile进行文件输入输出仅考虑了字符数为1的情况。在大多数情况下,Windows文件格式为CRLF,因此需要对文件进行判断。其中输出可以不用修改,但是读入需要进行修改判断该文件是采用CRLF还是其他的。
对原代码进行修改,在读取文件前先进行判断,即先读入若干字符,判断换行是否为\r\n若是则修改一个数独的字符大小为19*9+2(原为18*9+1),同时修改crlf变量为2(原为1),这样就对原代码进行了修改,经过测试通过。
代码修改如下:
- namespace SudokuReader
- {
- int num_bytes_of_sudoku_infile = 18 * 9 + 1;
- int crlf = 1;//默认只是一个字符
-
- inline void toSudoku(char* tmp, DWORD& n_bytes_read, const bool& is_end)
- {
- //由于读取时的限制,一定有num_of_sudoku_in_buff <= BUFF_SIZE
- int num_of_sudoku_in_buff = n_bytes_read / num_bytes_of_sudoku_infile;
- 10. if (is_end)//因为结束时,向下取整,少了一个
- 11. {
- 12. num_of_sudoku_in_buff++;
- 13. }
- 14. for (int i = 0, j = 0; i < num_of_sudoku_in_buff; i++, j += crlf)
- 15. {
- 16. Sudoku s = read_buff[i];
- 17. for (int row_idx = 1, col_idx = 1; j < (i + 1) * num_bytes_of_sudoku_infile - crlf; j += 2)
- 18. {
- 19. s[row_idx][col_idx++] = tmp[j] - ‘0‘;
- 20. if (col_idx == 10)
- 21. {
- 22. row_idx++;
- 23. col_idx = 1;
- 24. j += crlf - 1;
- 25. }
- 26. }
- 27. }
- 28. }
29. }
- 30.
31. //判断换行格式,如果是CRLF格式,修改传入数据
32. //否则不变
33. void judgeCRLF()
34. {
- 35. //只需要对第一行进行判断即可
- 36. const int dist = 30;
- 37. char* tmp = new char[dist];
- 38. DWORD n_bytes_read;
- 39. bool _ = ReadFile(h_sudoku_problem_txt, tmp, dist, &n_bytes_read, NULL);
- 40. for (int i = 0, j = 0; i < dist; i++)
- 41. {
- 42. if (tmp[i] >= ‘0‘ && tmp[i] <= ‘9‘)
- 43. {
- 44. j++;
- 45. if (j == 10)
- 46. {
- 47. if (i - 0 == 19)//CRLF
- 48. {
- 49. SudokuReader::num_bytes_of_sudoku_infile = 19 * 9 + 2;
- 50. SudokuReader::crlf = 2;
- 51. }
- 52. break;
- 53. }
- 54. }
- 55. }
- 56. SetFilePointer(h_sudoku_problem_txt, 0, NULL, FILE_BEGIN);
- 57. delete[] tmp;
58. }
- 59.
- 60.
61. //一次性读入BUFF_SIZE个数独
62. void readSudoku(bool& is_end,int& num_in_read_buff)
63. {
- 64. is_end = false;
- 65. DWORD n_bytes_read;
- 66. char* tmp = new char[SudokuReader::num_bytes_of_sudoku_infile * BUFF_SIZE + 10];
- 67. bool _ = ReadFile(h_sudoku_problem_txt, tmp, SudokuReader::num_bytes_of_sudoku_infile * BUFF_SIZE, &n_bytes_read, NULL);
- 68. num_in_read_buff = n_bytes_read / SudokuReader::num_bytes_of_sudoku_infile;
- 69. if (SudokuReader::num_bytes_of_sudoku_infile * BUFF_SIZE > n_bytes_read)
- 70. {
- 71. num_in_read_buff++;//因为结束时,向下取整,少了一个
- 72. is_end = true;
- 73. }
- 74. SudokuReader::toSudoku(tmp, n_bytes_read, is_end);
- 75. return;
- }