=============================================================================
涉及到的知識點有:
一、fopen函數。
二、fclose函數。
三、getc 和 putc 函數
1、通過getc和putc讀寫指定的檔案、2、拷貝檔案的代碼。(一個一個位元組的拷貝)、
3、改進版的代碼:通過指令行參數,實作指定檔案名的拷貝、4、檔案的加密解密操作。(用getc和putc函數實作)。
四、fgets 和 fputs函數
1、fgets 和 fputs函數、2、拷貝檔案的代碼。(一行一行位元組的拷貝)、3、檔案的加密解密操作。(用fgets和fputs函數實作)、
4、課堂練習:超大檔案排序、5、解析檔案内容并追加結果。
五、fprintf 和 fscanf函數
1、課堂練習:運作的結果是列印出這個檔案中年齡第二大人的姓名。
檔案操作
作為計算機語言,讀寫檔案是一個基本的能力。
一、fopen函數
FILE * 類型在堆裡面。
想要操作一個檔案,就要首先把檔案打開。
FILE *fopen(const char *path, const char *mode);
fopen打開檔案成功,傳回有效的FILE位址,失敗傳回NULL。
path就是指定打開檔案的路徑,可以是相對路徑,也可以是絕對路徑。
mode有以下幾個值:
r 以隻讀方式打開檔案,該檔案必須存在,且檔案必須是可讀的。
r+ 以可讀寫方式打開檔案,該檔案必須存在。
rb+ 讀寫打開一個二進制檔案,允許讀寫資料,檔案必須存在。(b隻在windows下有效,在linux下無效。)
rw+ 讀寫打開一個文本檔案,允許讀和寫。
w 打開隻寫檔案,若檔案存在則檔案長度請為0,即該檔案内容會消失。
若檔案不存在則建立該檔案。
w+ 打開可讀寫檔案,若檔案存在則檔案長度清為0,即該檔案内容會消失。
a 以附加的方式打開隻寫檔案。若檔案不存在,則會建立該檔案。
如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的内容會被保留。(EOF符保留)
a+ 以附加的方式打開可讀寫檔案。若檔案不存在,則會建立該檔案。
如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的内容會被保留。(原來的EOF符不保留)
需要包含頭檔案:#include <stdio.h>
--------------------------------------
二、fclose函數
fclose關閉fopen打開的檔案。
隻要成功用fopen打開的檔案,使用完成後就一定要調用fclose進行關閉。
int fclose(FILE *stream);
close的參數就是fopen的傳回值。
linux下示例代碼如下:
1 #include <stdio.h>
2
3 int main()
4 {
5 //FILE *p = fopen("./a.txt", "r"); //相對路徑。
6 //FILE *p = fopen("/home/chen/001/01/檔案操作day01/a.txt", "r"); //絕對路徑。
7
8 //"/home/chen/001/01/檔案操作day01/a.txt"因為這個是字元串常量,是以上面這句等價于下面:
9 char a[] = "/home/chen/001/01/檔案操作day01/a.txt";
10 FILE *p = fopen(a, "r");
11
12 if (p)
13 {
14 printf("success\n");
15 fclose(p); //檔案打開了。
16 }
17 else
18 {
19 printf("fail\n"); //這裡不需要調用fclsoe,因為檔案沒有打開成功。
20 }
21
22 return 0;
23 }
1、int getc(FILE *stream);
getc的參數是fopen成功打開檔案傳回的指針,getc的傳回值是一個char,即一次讀一個char。
getc的功能是:以位元組為機關讀取檔案内容。
文本檔案的最後結束标示是-1,也就是一個宏EOF。即#define EOF -1
注意:EOF不是檔案的一部分内容,隻是檔案結束的辨別而已,是以不要把它輸出來。
1 int main()
2 {
3 char a[] = "/home/chen/001/01/檔案操作day01/a.txt";
4 FILE *p = fopen(a, "r");
5
6 if (p)
7 {
8 printf("success\n");
9 while (1)
10 {
11 char c = getc(p); //從檔案p裡面一個一個位元組的讀出。
12 if (c == EOF)
13 {
14 break;
15 }
16 printf("%c", c);
17 }
18 fclose(p); //檔案打開了。
19 }
20 else
21 {
22 printf("fail\n"); //這裡不需要調用fclsoe,因為檔案沒有打開成功。
23 }
24
25 return 0;
26 }
27 --------------------------------------
28 改進版代碼:
29
30 #include <stdio.h>
31
32 int main()
33 {
34 char a[] = "/home/chen/001/01/檔案操作day01/a.txt";
35 FILE *p = fopen(a, "r");
36
37 if (p)
38 {
39 printf("success\n");
40 char c = getc(p); //從檔案p裡面一個一個位元組的讀出。
41 while (c != EOF)
42 {
43 printf("%c", c);
44 c = getc(p);
45 }
46 fclose(p);
47 }
48 else
49 {
50 printf("fail\n"); //這裡不需要調用fclose。
51 }
52
53 return 0;
54 }
55 注意:改進版的代碼:EOF不是檔案的一部分内容,隻是檔案結束的辨別而已,是以不要把它輸出來。
-----------------------------------------------------------------------------
2、int putc(int c, FILE *stream);
第一個參數是:要寫入的char;
第二個參數是:fopen傳回的檔案指針。
注意:getc必須是用r模式打開,putc必須是用w模式打開。
1 #include <stdio.h>
2
3 int main()
4 {
5 FILE *p = fopen("./a.txt", "w");
6 if (p)
7 {
8 putc('a', p); //向檔案p裡面一個一個位元組的寫入。
9 putc('b', p); //向檔案p裡面一個一個位元組的寫入。
10 putc('\n', p); //向檔案p裡面一個一個位元組的寫入。
11 fclose(p);
12 }
13
14 return 0;
15 }
通過getc和putc讀寫指定的檔案。
1 #include <stdio.h>
2
3 int main01(int argc, char **args)
4 {
5 if (argc < 2) //a b.txt
6 {
7 return 0;
8 }
9
10 FILE *p = fopen(args[1], "w");
11 if (p)
12 {
13 while (1)
14 {
15 char c = getchar(); //從标準輸入裝置讀取一個字元。
16 if (c == '0')
17 {
18 break;
19 }
20 putc(c, p); //向檔案p裡面一個一個位元組的寫入。
21 }
22 fclose(p);
23 }
24
25 return 0;
26 }
27
28 int main(int argc, char **args)
29 {
30 if (argc < 2)
31 {
32 return 0;
33 }
34
35 FILE *p = fopen(args[1], "r");
36 if (p)
37 {
38 char c = getc(p); //從檔案p裡面一個一個位元組的讀出。
39 while (c != EOF)
40 {
41 printf("%c", c);
42 c = getc(p);
43 }
44 fclose(p);
45 }
46
47 return 0;
48 }
拷貝檔案的代碼。(一個一個位元組的拷貝)
1 #include <stdio.h>
2
3 int main()
4 {
5 FILE *p = fopen("./a1.c", "r");
6 FILE *p1 = fopen("./abc.txt", "w");
7
8 if (p1 == NULL)
9 {
10 return 0;
11 }
12 if (p)
13 {
14 char c = getc(p); //從檔案p裡面一個一個位元組的讀出。
15 while (c != EOF)
16 {
17 putc(c, p1); //從檔案p裡面每讀一個char,就向檔案p1裡面寫一個char。
18 c = getc(p);
19 }
20 fclose(p);
21 fclose(p1);
22 }
23
24 return 0;
25 }
改進版的代碼:通過指令行參數,實作指定檔案名的拷貝。
例如:mycopy a.txt b.txt,把a.txt拷貝為b.txt了。
1 #include <stdio.h>
2
3 //通過指令行參數,實作指定檔案名的拷貝。
4 int main(int argc, char **args)
5 {
6 if (argc < 3)
7 {
8 return -1;
9 }
10 FILE *p = fopen(args[1], "r");
11 FILE *p1 = fopen(args[2], "w");
12
13 if (p1 == NULL)
14 {
15 return 0;
16 }
17 if (p)
18 {
19 char c = getc(p); //從檔案p裡面一個一個位元組的讀出。
20 while (c != EOF)
21 {
22 putc(c, p1); //從檔案p裡面每讀一個char,就向檔案p1裡面寫一個char。
23 c = getc(p);
24 }
25 fclose(p);
26 fclose(p1);
27 }
28
29 return 0;
30 }
檔案的加密解密操作。(用getc和putc函數實作)
1 #include <stdio.h>
2
3 //指令行有3個參數,第一個是源檔案,第二個是目标檔案,第三個參數0代表加密,1代表解密。
4 int main(int argc, char **args)
5 {
6 if (argc < 4)
7 {
8 return -1;
9 }
10 FILE *p = fopen(args[1], "r");
11 FILE *p1 = fopen(args[2], "w");
12
13 if (p1 == NULL)
14 {
15 return 0;
16 }
17 if (p)
18 {
19 char c = getc(p); //從p裡面一個一個位元組的讀出。
20 while (c != EOF)
21 {
22 //這裡根據第三個參數決定++還是--。
23 char tmp = args[3][0];
24 if (tmp == 0)
25 {
26 c++; //加密。char *fgets(char *s, int size, FILE *stream);
27 }
28 else
29 {
30 c--; //解密。
31 }
32 putc(c, p1); //從檔案p裡面每讀一個char,就向檔案p1裡面寫一個char。
33 c = getc(p);
34 }
35 fclose(p);
36 fclose(p1);
37 }
38
39 return 0;
40 }
這些函數都是通過 FILE * 來對檔案進行讀寫的。
1、fgets 和 fputs函數
fgets的傳回值是 char *,代表函數讀到的是字元串的首位址,如果fgets到了檔案末尾,繼續調用的話,則傳回NULL。
int fputs(const char *s, FILE *stream);
char *fgets(char *s, int size, FILE *stream);
1 #include <stdio.h>
2 #include <string.h>
3
4 //可以通過指令行參數指定檔案名。
5 int main(int argc, char **args)
6 {
7 if (argc < 2)
8 {
9 return 0;
10 }
11
12 FILE *p = fopen(args[1], "w");
13 if (p)
14 {
15 while (1)
16 {
17 char buf[1024] = { 0 };
18 fgets(buf, sizeof(buf), stdin); //從标準輸入裝置一次性擷取buf個位元組的資料。
19
20 if (strncmp(buf, "exit", 4) == 0)
21 {
22 break;
23 }
24 fputs(buf, p); //向檔案p裡面一次性寫入一個buf個位元組的資料。
25 }
26 fclose(p);
27 }
28
29 return 0;
30 }
拷貝檔案的代碼。(一行一行位元組的拷貝)
EOF 與 feof 函數
運作程式後,怎麼才能知道是否已經到達檔案結尾了呢?EOF代表檔案結尾。
如果已經是檔案尾,則調用函數feof傳回true。
int feof(FILE *stream);
函數的形參是fopen傳回的檔案指針。
EOF不屬于檔案的内容,隻是檔案的結尾标示,而且也不要直接用-1來代替EOF。
隻有文本檔案才能通過EOF判斷檔案的結尾标示,對于二進制檔案EOF是無效的。
1 #include <stdio.h>
2
3 int main(int argc, char **args)
4 {
5 if (argc < 3)
6 {
7 return 0;
8 }
9
10 FILE *p = fopen(args[1], "r"); //r 以隻讀方式打開檔案,該檔案必須存在,且檔案必須是可讀的。
11 if (p == NULL)
12 {
13 return 0;
14 }
15
16 FILE *p1 = fopen(args[2], "w"); //w 打開隻寫檔案,若檔案存在則檔案長度請為0,即該檔案内容會消失。 若檔案不存在則建立該檔案。
17 if (p1 == NULL)
18 {
19 return 0;
20 }
21
22 while (!feof(p)) //這句話的意思是:隻要沒有到檔案的結尾,那麼循環就繼續。
23 {
24 char buf[1024] = { 0 };
25 fgets(buf,sizeof(buf), p); //從源檔案p中讀取一行。
26 fputs(buf, p1); //向目标檔案p1中寫入一行。
27
28 //printf("%s", buf); //列印看看效果。
29 }
30
31 fclose(p);
32 fclose(p1);
33
34 return 0;
35 }
檔案的加密解密操作。(用fgets和fputs函數實作)
1 #include <stdio.h>
2
3 //加密。
4 void decode(char *s)
5 {
6 int len = 0;
7 while (s[len])
8 {
9 s[len]++;
10 len++;
11 }
12 }
13 //解密。
14 void encode(char *s)
15 {
16 int len = 0;
17 while (s[len])
18 {
19 s[len]--;
20 len++;
21 }
22 }
23
24 int main(int argc, char **args)
25 {
26 if (argc < 4)
27 return 0;
28
29 FILE *p1 = fopen(args[1], "r");
30 if (p1 == NULL)
31 return 0;
32
33 FILE *p2 = fopen(args[2], "w");
34 if (p2 == NULL)
35 return 0;
36
37 while (!feof(p1))
38 {
39 char buf[1024] = { 0 };
40 fgets(buf, sizeof(buf), p1);
41
42 if (args[3][0] == '0')
43 decode(buf);
44
45 if (args[3][0] == '1')
46 encode(buf);
47
48 fputs(buf, p2);
49 }
50 fclose(p1);
51 fclose(p2);
52
53 return 0;
54 }
55 chen@iZ2zeeailqvwws5dcuivdbZ:~/001/01/檔案操作day01$ a a2.c aa.c 0 加密
56 chen@iZ2zeeailqvwws5dcuivdbZ:~/001/01/檔案操作day01$ cat aa.c
57 chen@iZ2zeeailqvwws5dcuivdbZ:~/001/01/檔案操作day01$ a aa.c aaa.c 1 解密
58 chen@iZ2zeeailqvwws5dcuivdbZ:~/001/01/檔案操作day01$ cat aaa.c
課堂練習:超大檔案排序。
課堂練習:給很大的a.txt内容排序,但不能用堆,隻能用棧,排完序的内容要放回a.txt。(檔案的每一行是随機數)
1 //用随機數生成100個0到255之間的數,每個數為一行存放在a.txt中。
2 #include <stdio.h>
3 #include <time.h>
4 #include <stdlib.h>
5
6 int main()
7 {
8 srand((unsigned int)time(NULL));
9
10 FILE *p = fopen("a.txt", "w");
11
12 if (p)
13 {
14 int i;
15 for (i = 0; i < 100; i++)
16 {
17 int seq = rand() % 256;
18 char buf[100] = { 0 };//把int轉化成字元串。
19 sprintf(buf, "%d\n", seq);//sprintf使用方法與printf類似,唯一的差別是多了第一個參數,第一個參數是一個char的數組。
20 fputs(buf, p);
21 }
22 fclose(p);
23 }
24
25 return 0;
26 }
//将産生的a.txt進行排序。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 void swap(int *a, int *b)
5 {
6 int tmp = *a;
7 *a = *b;
8 *b = tmp;
9 }
10
11 void bubble(int *a, int n)
12 {
13 int i, j;
14 for (i = 0; i < n; i++)
15 {
16 for (j = 1; j < n - i; j++)
17 {
18 if (a[j - 1] > a[j])
19 {
20 swap(&a[j - 1], &a[j]);
21 }
22 }
23 }
24 }
25
26 int main()
27 {
28 FILE *p = fopen("./a.txt", "r");
29
30 int array[100] = { 0 };
31 int index = 0;
32 while (!feof(p))
33 {
34 char buf[1024] = { 0 };
35 fgets(buf, sizeof(buf), p);
36
37 //把讀出來的字元串轉化為整數,并存在數組array中。
38 array[index] = atoi(buf);
39 index++;
40 }
41 fclose(p);
42
43 //給數組進行冒泡排序。
44 bubble(array, 100);
45
46 p = fopen("./a.txt", "w");
47 int i;
48 for (i = 0; i < 100; i++)
49 {
50 char buf[1024] = { 0 };
51 sprintf(buf,"%d\n", array[i]);
52 fputs(buf, p);
53 }
54 fclose(p);
55
56 return 0;
57 }
冒泡排序:适合要排序的數量比較少的。如果資料量比較大的話,就不适合了。
c語言中,數組a[i++]和數組a[++i]有差別嗎?
b = a++; //先計算表達式的值,即先把a指派給了b;然後a再自加1。
b = ++a; //先a自加1後;然後把a自加後得到的指派給b。
小結:誰在前面先計算誰!!!
a[i++]; //相當于a[i]; i=i+1;
a[++i]; //相當于a[i+1]; i=i+1;
有差別,舉例說明:
1 #include <stdio.h>
2
3 int main ()
4 {
5 int a[3] = {1,2,3};
6 int i = 0;
7 printf("%d\n",a[i++]);//輸出的值為1,因為是i++,是以是先使用a[0]的值,i再加上1,即先輸出a[0]的值。
8
9 i = 0;
10 printf("%d\n",a[++i]);//輸出的值為2,因為++i,是以先直接使i加1,再輸出a[1]的值。
11
12 return 0;
13 }
在c語言中,數組a[0]++是什麼意思?
a[0]表示數組中的第一個值,可以把它看成一個變量x,
a[0]++也就是數組中第一個值+1再存放到原位。
比如:int a[2];
其中a[0]=1; a[1]=5;
a[0]++以後,a[0]的值變為2。
超大檔案排序示例代碼:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main()
5 {
6 FILE *p = fopen("a.txt", "r");
7
8 int array[256] = { 0 } ;
9 while (!feof(p))
10 {
11 char buf[1024] = { 0 };
12 fgets(buf, sizeof(buf), p);
13 int a = atoi(buf);
14 array[a]++;
15 }
16 fclose(p);
17
18 p = fopen("a.txt", "w");
19 int i, j;
20 for (i = 0; i < 256; i++)
21 {
22 for (j = 0; j < array[i]; j++)
23 {
24 char buf[1024] = { 0 };
25 sprintf(buf, "%d\n", i);
26 fputs(buf, p);
27 }
28 }
29 fclose(p);
30
31 return 0;
32 }
33
34 array[a]++;
35 該句代碼的解釋如下:
36
37 a[0] = 5
38 a[1] = 3
39 a[2] = 0
40 a[3] = 10
41
42 0在檔案中出現5次
43 1出現3次
44 2出現0次
45 3出現10次
解析檔案内容并追加結果。
a.txt檔案中中可能有1行,也可能有1w行,每行的格式是固定的。
且a.txt中的每一行資料的格式是:整數運算符整數=
即:
34*5=
25+41=
65/5=
78-41=
......
要求寫個程式,運作的結果是在a.txt檔案中每行後面自動添加計算結果,
可以用堆,也可以用棧,但隻能有a.txt這一個檔案,不能再生成其他新的檔案。
1 #include <stdio.h>
2
3 int func1(int a, char b, int c)
4 {
5 switch (b)
6 {
7 case '+':
8 return a + c;
9 case '-':
10 return a - c;
11 case '*':
12 return a * c;
13 case '/':
14 if (c != 0)
15 {
16 return a / c;
17 }
18 }
19 return 0;
20 }
21
22 int main()
23 {
24 FILE *p = fopen("a.txt", "r");
25
26 char array[100][100] = { 0 };
27 int index = 0;
28 while (1)
29 {
30 char buf[1024] = { 0 };
31 fgets(buf, sizeof(buf), p); //假設檔案讀到最後一行輸出後,其檔案已經讀完了。但是feof需要再判斷一次。
32
33 //已經到了最後一行,此時調用feof,feof函數傳回true。
34 if (feof(p))
35 {
36 break;
37 }
38
39 int a = 0;
40 char b = 0;
41 int c = 0;
42 sscanf(buf, "%d%c%d=", &a, &b, &c);
43 //printf("%d%c%d=%d\n", a, b, c, func1(a, b, c)); //格式化字元串函數sprintf(輸出)、格式化字元串函數sscanf(讀取輸入)。
44 sprintf(array[index], "%d%c%d=%d\n", a, b, c, func1(a, b, c));
45 index++;
46 }
47 fclose(p);
48
49 p = fopen("a.txt", "w");
50 int i;
51 for (i = 0; i < index; i++)
52 {
53 fputs(array[i], p);
54 }
55 fclose(p);
56
57 return 0;
58 }
//以上代碼隻能處理100行的檔案。用棧不行,那就用堆!
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int func1(int a, char b, int c)
5 {
6 switch(b)
7 {
8 case '+':
9 return a + c;
10 case '-':
11 return a - c;
12 case '*':
13 return a * c;
14 case '/':
15 if (c != 0)
16 return a / c;
17 }
18 return 0;
19 }
20
21 #define NUM 100
22
23 int main()
24 {
25 FILE *p = fopen("a.txt", "r");
26
27 //char array[100][100] = { 0 };
28 char *array = calloc(NUM, sizeof(char));
29 char *tmp = array; //代表目前要寫入字元的位置。
30 int index = 0;
31 while(1)
32 {
33 char buf[100] = { 0 };
34 fgets(buf, sizeof(buf), p); //假設檔案讀到最後一行輸出後,其檔案已經讀完了。但是feof需要再判斷一次。
35
36 //已經到了最後一行,此時調用feof,feof函數傳回true。
37 if (feof(p))
38 break;
39
40 int a = 0;
41 char b = 0;
42 int c = 0;
43 sscanf(buf, "%d%c%d=", &a, &b, &c);
44 //printf("%d%c%d=%d\n", a, b, c, func1(a, b, c)); //格式化字元串函數sprintf(輸出)、格式化字元串函數sscanf(讀取輸入)。
45 //sprintf(array[index], "%d%c%d=%d\n", a, b, c, func1(a, b, c));
46 //sprintf(array, "%d%c%d=%d\n", a, b, c, func1(a, b, c));
47 sprintf(tmp,"%d%c%d=%d\n", a, b, c, func1(a, b, c));
48 array = realloc(array, NUM * (index + 2)); //array永遠指向堆記憶體的首位址。
49 tmp = array + (NUM * (index + 1)); //tmp每次往後移動100個位元組。
50 index++;
51 }
52 fclose(p);
53 p = fopen("a.txt", "w");
54 int i;
55 tmp = array; //讓tmp回到起始位置。
56 for(i = 0; i < index; i++)
57 {
58 //fputs(array[i], p);
59 fputs(tmp, p);
60 tmp += NUM;
61 }
62 fclose(p);
63 free(array);
64
65 return 0;
66 }
fscanf從一個檔案中讀取我想要的内容。即從一個檔案中讀取内容并轉義。
sscanf從一個字元串中讀取我想要的内容。即從一個字元串中讀取内容并轉義。
fprintf向一個檔案進行輸出。
sprintf向一個字元串進行輸出。
1 #include <stdio.h>
2
3 int func1(int a, char b, int c)
4 {
5 switch(b)
6 {
7 case '+':
8 return a + c;
9 case '-':
10 return a - c;
11 case '*':
12 return a * c;
13 case '/':
14 if (c != 0)
15 return a / c;
16 }
17 return 0;
18 }
19
20 int main()
21 {
22 FILE *p = fopen("a.txt", "r");
23 FILE *p1 = fopen("b.txt", "w");
24
25 while (1)
26 {
27 int a = 0;
28 char b = 0;
29 int c = 0;
30 fscanf(p, "%d%c%d=", &a, &b, &c);
31 if (feof(p))
32 return 0;
33
34 //printf("%d, %c, %d\n", a, b, c);
35 fprintf(p1,"%d%c%d=%d\n", a, b, c, func1(a, b, c));
36 }
37 fclose(p);
38 fclose(p1);
39
40 return 0;
41 }
課後練習
姓名=劉德華,年齡=50
姓名=安倍,年齡=30
姓名=張學友,年齡=45
用c語言寫程式,其實就是針對記憶體的每個位元組進行操作。
也就是說我們若是知道每個記憶體裡面每個位元組是什麼東西的話,那麼我們就可以自由的進行操作的。
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4
5 int main()
6 {
7 FILE *p = fopen("a.txt", "r");
8
9 while (1)
10 {
11 char buf[1024] = { 0 };
12 fgets(buf, sizeof(buf), p);
13
14 if (feof(p))
15 {
16 break;
17 }
18 char *s = strtok(buf, ","); //字元串分割函數strtok。注意:在第二次至以後調用strtok函數時,第一個參數寫NULL。
19 char *name = strchr(s, '='); //字元串查找字元函數strchr。
20 //printf("%s\n", s);
21 //printf("%s\n", name);
22 printf("%s\n", &s[7]);
23 //printf("%s\n", &name[1]);
24
25 s = strtok(NULL, ",");
26 //printf("%s", s); //年齡=50 在UTF-8情況下,每個漢字占用3個位元組。
27 //printf("%s", &s[7]); //字元串轉化為int類型。
28 printf("%d\n", atoi(&s[7]));
29 }
30 fclose(p);
31
32 return 0;
33 }
34 輸出結果為:
35 劉德華
36 50
37 安倍
38 30
39 張學友
40 45
運作的結果是列印出這個檔案中年齡第二大人的姓名。
先來複習下一維數組中找第二進制素的代碼:
1 #include <stdio.h>
2
3 int main()
4 {
5 int a[5] = { 12, 45, 56, 13, 98 };
6 int max = 0;
7 int smax = 0;
8
9 int i;
10 for (i = 0; i < 5; i++)
11 {
12 if (a[i] > max)
13 {
14 smax = max;
15 max = a[i];
16 }
17 else if (a[i] < max && a[i] > smax)
18 {
19 smax = a[i];
20 }
21 }
22 printf("%d\n", smax);
23
24 return 0;
25 }
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4
5 int main()
6 {
7 FILE *p = fopen("a.txt", "r");
8
9 int max = 0;
10 int smax = 0;
11 char max_name[100] = { 0 };
12 char smax_name[100] = { 0 };
13
14 while (1)
15 {
16 char buf[1024] = { 0 };
17 fgets(buf, sizeof(buf), p);
18
19 if (feof(p))
20 {
21 break;
22 }
23 char *s = strtok(buf, ","); //字元串分割函數strtok。注意:在第二次至以後調用strtok函數時,第一個參數寫NULL。
24 char *name = strchr(s, '='); //字元串查找字元函數strchr。
25 //printf("%s\n", s);
26 //printf("%s\n", name);
27 //printf("%s\n", &s[7]);
28 //printf("%s\n", &name[1]);
29
30 s = strtok(NULL, ",");
31 //printf("%s", s); //年齡=50 在UTF-8情況下,每個漢字占用3個位元組。
32 //printf("%s", &s[7]); //字元串轉化為int類型。
33 //printf("%d\n", atoi(&s[7]));
34
35 if (atoi(&s[7]) > max)
36 {
37 smax = max;
38 max = atoi(&s[7]);
39
40 strcpy(smax_name, max_name);
41 strcpy(max_name, &name[1]);
42 }
43 else if (atoi(&s[7]) < max && atoi(&s[7]) > smax)
44 {
45 smax = atoi(&s[7]);
46
47 strcpy(smax_name, &name[1]);
48 }
49 }
50 fclose(p);
51
52 printf("%s\n", smax_name);
53
54 return 0;
55 }
我的GitHub位址:
https://github.com/heizemingjun我的部落格園位址:
http://www.cnblogs.com/chenmingjun我的螞蟻筆記部落格位址:
http://blog.leanote.com/chenmingjunCopyright ©2018 黑澤明軍
【轉載文章務必保留出處和署名,謝謝!】