1. 程式人生 > >63.當當網txt數據按行切割與合並

63.當當網txt數據按行切割與合並

分割 scanf 寫入文件 宏定義 == pause clas class alloc

  • 獲取文件有多少行
     1 //獲取文件有多少行
     2 int getN(char *path)
     3 {
     4     FILE *pf = fopen(path, "r");
     5     if (pf==NULL)
     6     {
     7         return -1;
     8     } 
     9     else
    10     {
    11         int i = 0;
    12         while (!feof(pf))
    13         {
    14             char str[256] = { 0 };
    15             fgets(str, 256, pf);
    
    16 i++; 17 } 18 fclose(pf); 19 return i; 20 } 21 }

  • 宏定義行數
    1 //數據的行數
    2 #define N 13180820

  • 文件按行切割
     1 //文件切割
     2 void space(char *path, int num)
     3 {
     4     char ** pathes = malloc(sizeof(char*)*num);
     5     for (int i = 0; i < num;i++)
     6     {
     7         pathes[i] = malloc(sizeof
    (char) * 256); 8 //格式化處理文件名 9 sprintf(pathes[i], "dangdangwang%d.txt", i + 1); 10 } 11 12 //打開文件 13 FILE *pf = fopen(path, "r"); 14 15 if (pf == NULL) 16 { 17 return -1; 18 } 19 else 20 { 21 //如果能被整除 22 if (N%num == 0) 23 {
    24 for (int i = 0; i < num;i++) 25 { 26 //寫入文件 27 FILE *pfw = fopen(pathes[i], "w"); 28 for (int j = 0; j < N / num; j++) 29 { 30 char str[1024] = { 0 }; 31 //讀取一行寫入一行 32 fgets(str, 1024, pf); 33 fputs(str, pfw); 34 } 35 fclose(pfw); 36 } 37 } 38 else 39 { 40 for (int i = 0; i < num - 1; i++) 41 { 42 //寫入文件 43 FILE *pfw = fopen(pathes[i], "w"); 44 //處理前面n-1個 45 for (int j = 0; j < N / (num-1); j++) 46 { 47 char str[1024] = { 0 }; 48 //讀取一行寫入一行 49 fgets(str, 1024, pf); 50 fputs(str, pfw); 51 } 52 fclose(pfw); 53 54 } 55 56 { 57 //處理剩下的 58 //寫入 59 FILE *pfw = fopen(pathes[num-1], "w"); 60 for (int j = 0; j < N %(num-1); j++) 61 { 62 char str[1024] = { 0 }; 63 //讀取一行寫入一行 64 fgets(str, 1024, pf); 65 fputs(str, pfw); 66 } 67 fclose(pfw); 68 } 69 } 70 fclose(pf); 71 } 72 }

  • 文件合並
     1 //合並文件
     2 void merge(char *newpath,int n)
     3 {
     4     char ** pathes = malloc(sizeof(char*)*n);
     5     for (int i = 0; i < n; i++)
     6     {
     7         pathes[i] = malloc(sizeof(char) * 256);
     8         sprintf(pathes[i], "dangdangwang%d.txt", i + 1);
     9     }
    10 
    11 
    12     //寫入文件
    13     FILE *pf = fopen(newpath, "w");
    14     if (pf == NULL)
    15     {
    16         return -1;
    17     }
    18     else
    19     {
    20         //依次讀取每個文件
    21         for (int i = 0; i < n;i++)
    22         {
    23             FILE *pfr = fopen(pathes[i], "r");
    24 
    25             while (!feof(pfr))
    26             {
    27                 char str[1024] = { 0 };
    28                 //讀取一行寫入一行
    29                 fgets(str, 1024, pfr);
    30                 fputs(str, pf);
    31             }
    32             fclose(pfr);
    33         }
    34         fclose(pf);
    35     }
    36 }

  • 測試函數
     1 void main()
     2 {
     3     //int num = getN(path);
     4     //printf("%d", num);獲取行數
     5     int  num;
     6     scanf("%d", &num);
     7 
     8     //分割
     9     space(path, num);
    10     //合並
    11     merge(newpath, num);
    12 
    13     system("pause");
    14 }

完整代碼:

  1 #define  _CRT_SECURE_NO_WARNINGS
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 char *path = "dangdangwang.txt";
  5 char *newpath = "dangdangwangN.txt";
  6 
  7 //數據的行數
  8 #define N 13180820
  9 
 10 //獲取文件有多少行
 11 int getN(char *path)
 12 {
 13     FILE *pf = fopen(path, "r");
 14     if (pf==NULL)
 15     {
 16         return -1;
 17     } 
 18     else
 19     {
 20         int i = 0;
 21         while (!feof(pf))
 22         {
 23             char str[256] = { 0 };
 24             fgets(str, 256, pf);
 25             i++;
 26         }
 27         fclose(pf);
 28         return i;
 29     }
 30 }
 31 
 32 //文件切割
 33 void space(char *path, int num)
 34 {
 35     char ** pathes = malloc(sizeof(char*)*num);
 36     for (int i = 0; i < num;i++)
 37     {
 38         pathes[i] = malloc(sizeof(char) * 256);
 39         //格式化處理文件名
 40         sprintf(pathes[i], "dangdangwang%d.txt", i + 1);
 41     }
 42     
 43     //打開文件
 44     FILE *pf = fopen(path, "r");
 45 
 46     if (pf == NULL)
 47     {
 48         return -1;
 49     }
 50     else
 51     {
 52         //如果能被整除
 53         if (N%num == 0)
 54         {
 55             for (int i = 0; i <  num;i++)
 56             {
 57                 //寫入文件
 58                 FILE *pfw = fopen(pathes[i], "w");
 59                 for (int j = 0; j < N / num; j++)
 60                 {
 61                     char str[1024] = { 0 };
 62                     //讀取一行寫入一行
 63                     fgets(str, 1024, pf);
 64                     fputs(str, pfw);
 65                 }
 66                 fclose(pfw);
 67             }
 68         }
 69         else
 70         {
 71             for (int i = 0; i < num - 1; i++)
 72             {
 73                 //寫入文件
 74                 FILE *pfw = fopen(pathes[i], "w");
 75                 //處理前面n-1個
 76                 for (int j = 0; j < N / (num-1); j++)
 77                 {
 78                     char str[1024] = { 0 };
 79                     //讀取一行寫入一行
 80                     fgets(str, 1024, pf);
 81                     fputs(str, pfw);
 82                 }
 83                 fclose(pfw);
 84 
 85             }
 86 
 87             {
 88                 //處理剩下的
 89                 //寫入
 90                 FILE *pfw = fopen(pathes[num-1], "w");
 91                 for (int j = 0; j < N %(num-1); j++)
 92                 {
 93                     char str[1024] = { 0 };
 94                     //讀取一行寫入一行
 95                     fgets(str, 1024, pf);
 96                     fputs(str, pfw);
 97                 }
 98                 fclose(pfw);
 99             }
100         }
101         fclose(pf);
102     }
103 }
104 
105 //合並文件
106 void merge(char *newpath,int n)
107 {
108     char ** pathes = malloc(sizeof(char*)*n);
109     for (int i = 0; i < n; i++)
110     {
111         pathes[i] = malloc(sizeof(char) * 256);
112         sprintf(pathes[i], "dangdangwang%d.txt", i + 1);
113     }
114 
115 
116     //寫入文件
117     FILE *pf = fopen(newpath, "w");
118     if (pf == NULL)
119     {
120         return -1;
121     }
122     else
123     {
124         //依次讀取每個文件
125         for (int i = 0; i < n;i++)
126         {
127             FILE *pfr = fopen(pathes[i], "r");
128 
129             while (!feof(pfr))
130             {
131                 char str[1024] = { 0 };
132                 //讀取一行寫入一行
133                 fgets(str, 1024, pfr);
134                 fputs(str, pf);
135             }
136             fclose(pfr);
137         }
138         fclose(pf);
139     }
140 }
141 
142 
143 void main()
144 {
145     //int num = getN(path);
146     //printf("%d", num);獲取行數
147     int  num;
148     scanf("%d", &num);
149 
150     //分割
151     space(path, num);
152     //合並
153     merge(newpath, num);
154 
155     system("pause");
156 }

63.當當網txt數據按行切割與合並