1. 程式人生 > >57.大數據線性處理csdn數據(fread,fwrite)

57.大數據線性處理csdn數據(fread,fwrite)

truct sizeof 代碼 ++ fop != warnings 下一個 crt

  • 創建結構體存儲csdn數據
    1 struct csdn
    2 {
    3     char name[22];
    4     char password[43];
    5     char email[52];
    6 
    7 };

  • 對於分配的大小要先獲取最大的長度,定義如下
    1 //姓名最大長度
    2 int namemax = -1;
    3 //密碼最大長度
    4 int passmax = -1;
    5 //郵件最大長度
    6 int mailmax = -1;
     1 //獲取各部分最大長度
     2 void getmax(char *str)
     3 {
     4     //遍歷,把所有‘#‘轉化成‘\0‘
     5     for
    (char *p = str; *p != \0; p++) 6 { 7 if (*p == #) 8 { 9 *p = \0; 10 } 11 } 12 //max1:姓名的長度 13 int max1 = strlen(str); 14 if (max1>namemax) 15 { 16 namemax = max1; 17 } 18 //max2:密碼的長度 19 char *pstr1 = str + strlen(str) + 1
    ; 20 int max2 = strlen(pstr1); 21 if (max2>passmax) 22 { 23 passmax = max2; 24 } 25 26 //max3:email的長度 27 char *pstr2 = pstr1 + strlen(pstr1) + 1; 28 int max3 = strlen(pstr2); 29 if (max3>mailmax) 30 { 31 mailmax = max3; 32 } 33 }

  • fgets讀取到的數據寫入到結構體中
     1
    //字符串初始化結構體 2 void init(struct csdn *pdata, char *str) 3 { 4 //遍歷,把所有‘#‘轉化成‘\0‘ 5 for (char *p = str; *p != \0;p++) 6 { 7 if (*p==#) 8 { 9 *p = \0; 10 } 11 } 12 //把姓名copy到結構體中 13 strcpy(pdata->name, str); 14 //加字符串長度到字符串後一位‘\0‘,再加1到下一個字符串起始位置 15 char *pstr1 = str + strlen(str) + 1; 16 //把密碼copy到結構體中 17 strcpy(pdata->password, pstr1); 18 char *pstr2 = pstr1 + strlen(pstr1) + 1; 19 //把email copy到結構體中 20 strcpy(pdata->email, pstr2); 21 }

  • 讀取文件並寫入到結構體中,然後在把結構體寫到文件中
     1 //寫入數據
     2 void readfiletxt()
     3 {
     4     //讀取文件
     5     FILE *pfr = fopen("csdn.txt", "r");
     6     //以二進制方式寫文件
     7     FILE *pfw = fopen("csdn.bin", "wb");
     8 
     9     //如果打開失敗則返回
    10     if (pfr==NULL)
    11     {
    12         return;
    13     } 
    14     //否則寫數據
    15     else
    16     {
    17         //如果沒有到文件末尾
    18         while (!feof(pfr))
    19         {
    20             //存取讀取到的數據
    21             char str[256] = { 0 };
    22             //讀取一行
    23             fgets(str, 256, pfr);
    24             //創建結構體
    25             struct csdn csdn1;
    26             //把讀取到到的數據寫到結構體中
    27             init(&csdn1, str);
    28             //把結構體寫入文件
    29             fwrite(&csdn1, sizeof(struct csdn), 1, pfw);//寫入
    30         }
    31 
    32     }
    33     //關閉文件
    34     fclose(pfr);
    35     fclose(pfw);
    36 }

  • 測試代碼
     1 void main()
     2 {
     3 
     4     FILE *pf = fopen("csdn.bin", "rb+");
     5     while (1)
     6     {
     7         printf("請輸入你要讀取的第N個元素:");
     8         int N;
     9         scanf("%d", &N);
    10 
    11 
    12         struct csdn csdn1 = {0};
    13         //移動到相應的結構體位置(註意:fwrite寫入的必須是同一種類的,這樣才好讀取)
    14         fseek(pf, sizeof(struct csdn)*(N - 1), SEEK_SET);
    15         //讀取
    16         fread(&csdn1, sizeof(struct csdn), 1, pf);
    17         //輸出結果
    18         printf("\n%s,%s,%s", csdn1.name, csdn1.password, csdn1.email);
    19     }
    20     fclose(pf);
    21     system("pause");
    22 }

完整代碼:

  1 #define  _CRT_SECURE_NO_WARNINGS
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 
  5 //csdn結構體
  6 struct csdn
  7 {
  8     char name[22];
  9     char password[43];
 10     char email[52];
 11 
 12 };
 13 //姓名最大長度
 14 int namemax = -1;
 15 //密碼最大長度
 16 int passmax = -1;
 17 //郵件最大長度
 18 int mailmax = -1;
 19 
 20 //字符串初始化結構體
 21 void init(struct csdn *pdata, char *str)
 22 {
 23     //遍歷,把所有‘#‘轉化成‘\0‘
 24     for (char *p = str; *p != \0;p++)
 25     {
 26         if (*p==#)
 27         {
 28             *p = \0;
 29         }
 30     }
 31     //把姓名copy到結構體中
 32     strcpy(pdata->name, str);
 33     //加字符串長度到字符串後一位‘\0‘,再加1到下一個字符串起始位置
 34     char *pstr1 = str + strlen(str) + 1;
 35     //把密碼copy到結構體中
 36     strcpy(pdata->password, pstr1);
 37     char *pstr2 = pstr1 + strlen(pstr1) + 1;
 38     //把email copy到結構體中
 39     strcpy(pdata->email, pstr2);
 40 }
 41 
 42 //獲取各部分最大長度
 43 void getmax(char *str)
 44 {
 45     //遍歷,把所有‘#‘轉化成‘\0‘
 46     for (char *p = str; *p != \0; p++)
 47     {
 48         if (*p == #)
 49         {
 50             *p = \0;
 51         }
 52     }
 53     //max1:姓名的長度
 54     int max1 = strlen(str);
 55     if (max1>namemax)
 56     {
 57         namemax = max1;
 58     }
 59     //max2:密碼的長度
 60     char *pstr1 = str + strlen(str) + 1;
 61     int max2 = strlen(pstr1);
 62     if (max2>passmax)
 63     {
 64         passmax = max2;
 65     }
 66 
 67     //max3:email的長度
 68     char *pstr2 = pstr1 + strlen(pstr1) + 1;
 69     int max3 = strlen(pstr2);
 70     if (max3>mailmax)
 71     {
 72         mailmax = max3;
 73     }
 74 }
 75 
 76 //寫入數據
 77 void readfiletxt()
 78 {
 79     //讀取文件
 80     FILE *pfr = fopen("csdn.txt", "r");
 81     //以二進制方式寫文件
 82     FILE *pfw = fopen("csdn.bin", "wb");
 83 
 84     //如果打開失敗則返回
 85     if (pfr==NULL)
 86     {
 87         return;
 88     } 
 89     //否則寫數據
 90     else
 91     {
 92         //如果沒有到文件末尾
 93         while (!feof(pfr))
 94         {
 95             //存取讀取到的數據
 96             char str[256] = { 0 };
 97             //讀取一行
 98             fgets(str, 256, pfr);
 99             //創建結構體
100             struct csdn csdn1;
101             //把讀取到到的數據寫到結構體中
102             init(&csdn1, str);
103             //把結構體寫入文件
104             fwrite(&csdn1, sizeof(struct csdn), 1, pfw);//寫入
105         }
106 
107     }
108     //關閉文件
109     fclose(pfr);
110     fclose(pfw);
111 }
112 
113 void main()
114 {
115 
116     FILE *pf = fopen("csdn.bin", "rb+");
117     while (1)
118     {
119         printf("請輸入你要讀取的第N個元素:");
120         int N;
121         scanf("%d", &N);
122 
123 
124         struct csdn csdn1 = {0};
125         //移動到相應的結構體位置(註意:fwrite寫入的必須是同一種類的,這樣才好讀取)
126         fseek(pf, sizeof(struct csdn)*(N - 1), SEEK_SET);
127         //讀取
128         fread(&csdn1, sizeof(struct csdn), 1, pf);
129         //輸出結果
130         printf("\n%s,%s,%s", csdn1.name, csdn1.password, csdn1.email);
131     }
132     fclose(pf);
133     system("pause");
134 }

57.大數據線性處理csdn數據(fread,fwrite)