天天看點

c語言基礎學習10_檔案操作01

=============================================================================

涉及到的知識點有:

一、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/chenmingjun

Copyright ©2018 黑澤明軍

【轉載文章務必保留出處和署名,謝謝!】