1 //读文件到内存中,不能浪费内存空间
2 //禁止使用 char buf[][1024]式二维字符数组浪费内存
3 #include
4 #include
5 #include <string.h>
6
7 int main(void)
8 {
9 FILE* pf = fopen("G:/qtcode/smb.conf","r+");
10 if(pf == NULL)
11 exit(-1);
12 //先计算文件内容有多少行,
13 int lineCount = 0;
14 char buf[1024];
15 while(fgets(buf,1024,pf) != NULL)
16 {
17 lineCount++;
18 }
19 rewind(pf);
20
21 //建立堆上的二维空间,存储每行字符串
22 char **p = (char**)malloc(sizeof(char*)*(lineCount+1));
23 memset(p,0,sizeof(char*)*(lineCount+1));
24
25 int len;
26 char **sp = p;//注意点,不要改变p的指向,用临时的
27 while(fgets(buf,1024,pf) != NULL)
28 {
29 len = strlen(buf);
30 *sp = (char*)malloc(len+1);
31 strcpy(*sp,buf);
32 sp++;
33 }
34 *sp = NULL;//让指针数组最后一个元素为NULL,便于遍历。
35
36 fclose(pf);
37
38 //访问内存中的内容,打印
39 sp = p;
40 while(*sp)
41 {
42 printf("%s",*sp++);
43 }
44
45 //释放
46 //方式1
47 #if 0
48 sp = p;
49 while(*sp)
50 {
51 free(*sp);
52 }
53 free(p);
54 #endif
55
56 #if 1
57 //方式2.1
58 int i;
59 for(i = 0; i)
60 {
61 free(p[i]);
62 }
63 free(p);
64 #endif
65
66 #if 0
67 //方式2.2
68 int i;
69 for(i = 0; p[i];i++)
70 {
71 free(p[i]);
72 }
73 free(p);
74 #endif
75
76 return 0;
77 }