软件工程——数独 集成测试2

abdstime 2020-01-18

一、    换行格式问题

在与同学进行测试的过程中发现,一个文件的换行格式可以有多种,即CRLF,CR,LF三种,而我在进行输入输出的时候使用ReadFile和WriteFile进行文件输入输出仅考虑了字符数为1的情况。在大多数情况下,Windows文件格式为CRLF,因此需要对文件进行判断。其中输出可以不用修改,但是读入需要进行修改判断该文件是采用CRLF还是其他的。

对原代码进行修改,在读取文件前先进行判断,即先读入若干字符,判断换行是否为\r\n若是则修改一个数独的字符大小为19*9+2(原为18*9+1),同时修改crlf变量为2(原为1),这样就对原代码进行了修改,经过测试通过。

代码修改如下:

  1. namespace SudokuReader  
    1. {  
    2.     int num_bytes_of_sudoku_infile = 18 * 9 + 1;  
    3.     int crlf = 1;//默认只是一个字符  
    4.   
    5.     inline void toSudoku(char* tmp, DWORD& n_bytes_read, const bool& is_end)  
    6.     {  
    7.         //由于读取时的限制,一定有num_of_sudoku_in_buff <= BUFF_SIZE  
    8.         int num_of_sudoku_in_buff = n_bytes_read / num_bytes_of_sudoku_infile;  
    9. 10.         if (is_end)//因为结束时,向下取整,少了一个  
    10. 11.         {  
    11. 12.             num_of_sudoku_in_buff++;  
    12. 13.         }  
    13. 14.         for (int i = 0, j = 0; i < num_of_sudoku_in_buff; i++, j += crlf)  
    14. 15.         {  
    15. 16.             Sudoku s = read_buff[i];  
    16. 17.             for (int row_idx = 1, col_idx = 1; j < (i + 1) * num_bytes_of_sudoku_infile - crlf; j += 2)  
    17. 18.             {  
    18. 19.                 s[row_idx][col_idx++] = tmp[j] - ‘0‘;  
    19. 20.                 if (col_idx == 10)  
    20. 21.                 {  
    21. 22.                     row_idx++;  
    22. 23.                     col_idx = 1;  
    23. 24.                     j += crlf - 1;  
    24. 25.                 }  
    25. 26.             }  
    26. 27.         }  
    27. 28.     }  

29. }  

  1. 30.   

31. //判断换行格式,如果是CRLF格式,修改传入数据  

32. //否则不变  

33. void judgeCRLF()  

34. {  

  1. 35.     //只需要对第一行进行判断即可  
  2. 36.     const int dist = 30;  
  3. 37.     char* tmp = new char[dist];  
  4. 38.     DWORD n_bytes_read;  
  5. 39.     bool _ = ReadFile(h_sudoku_problem_txt, tmp, dist, &n_bytes_read, NULL);  
  6. 40.     for (int i = 0, j = 0; i < dist; i++)  
  7. 41.     {  
  8. 42.         if (tmp[i] >= ‘0‘ && tmp[i] <= ‘9‘)  
  9. 43.         {  
  10. 44.             j++;  
  11. 45.             if (j == 10)  
  12. 46.             {  
  13. 47.                 if (i - 0 == 19)//CRLF  
  14. 48.                 {  
  15. 49.                     SudokuReader::num_bytes_of_sudoku_infile = 19 * 9 + 2;  
  16. 50.                     SudokuReader::crlf = 2;  
  17. 51.                 }  
  18. 52.                 break;  
  19. 53.             }  
  20. 54.         }  
  21. 55.     }  
  22. 56.     SetFilePointer(h_sudoku_problem_txt, 0, NULL, FILE_BEGIN);  
  23. 57.     delete[] tmp;  

58. }  

  1. 59.   
  2. 60.   

61. //一次性读入BUFF_SIZE个数独  

62. void readSudoku(bool& is_end,int& num_in_read_buff)  

63. {  

  1. 64.     is_end = false;  
  2. 65.     DWORD n_bytes_read;  
  3. 66.     char* tmp = new char[SudokuReader::num_bytes_of_sudoku_infile * BUFF_SIZE + 10];  
  4. 67.     bool _ = ReadFile(h_sudoku_problem_txt, tmp, SudokuReader::num_bytes_of_sudoku_infile * BUFF_SIZE, &n_bytes_read, NULL);  
  5. 68.     num_in_read_buff = n_bytes_read / SudokuReader::num_bytes_of_sudoku_infile;  
  6. 69.     if (SudokuReader::num_bytes_of_sudoku_infile * BUFF_SIZE > n_bytes_read)  
  7. 70.     {  
  8. 71.         num_in_read_buff++;//因为结束时,向下取整,少了一个  
  9. 72.         is_end = true;  
  10. 73.     }  
  11. 74.     SudokuReader::toSudoku(tmp, n_bytes_read, is_end);  
  12. 75.     return;  
  13. }  
 

相关推荐