57.大數據線性處理csdn數據(fread,fwrite)
阿新 • • 發佈:2018-02-10
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
- fgets讀取到的數據寫入到結構體中
1
- 讀取文件並寫入到結構體中,然後在把結構體寫到文件中
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)