欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言之_双重指针、多文件、include、文件

程序员文章站 2022-03-23 19:44:38
1、双重指针 #include #include #include void modify_p(int *p) { *p=*p+1; } int ma...

1、双重指针

#include
#include
#include


void modify_p(int *p)
{
*p=*p+1;
}
int main()
{
int a=100;
int *p=&a;
modify_p(p);
printf("%p\n",p);
return 0;
}
////
//a值被改变了,而p值没有被改变


void modify_p(int *p)
{
*p=*p+1;
}
int main()
{
int a=100;
int *p=&a;
modify_p(p);
printf("%p\n",p);
return 0;
}
//需求:就是要改p ------必须要用 双重指针
void modify_p(int **p)
{
*p=*p+1;
}
int main()
{
int a=100;
int *p=&a;
modify_p(&p);
printf("%p\n",p);
return 0;
}


知识点:----函数可以用它的 返回值 来替换
int sum_bmd(int a,int b)
{
int result=a+b;
return result;
}


int main()
{
int a=10;
int b=20;
30;



return 0;
}

多文件
//main.cpp
#include
float sum(float a,float b);
int main()
{
float a=10.1f;
float b=20.1f;
float result=sum(a,b);
printf("sum is %f\n",result);


return 0;
}
//math_bmd.h------接口
float sum(float a,float b);
//math_bmd.cpp
float sum(float a,float b)
{


return a+b;
}


说明:
实际项目中有这种情况:
math_bmd.h和math_bmd.cpp是别的程序员写。他有可能以后会只提供 .h文件,而.cpp文件用1个二进制库文件来代替。
我们如够要用它的若干函数,就只能看.h 文件了-------.h文件中的函数,可以知识库中的1部分,公开的函数原型-----接口函数
文件
将3个学生信息----输出到 显示器文件
代码:
#include
#include
#include


struct Student
{
int number;
char *name;
};


int main()
{
struct Student stu[3]={1001,"zhangsan",1002,"lisi",1003,"wangwu"};
for(int i=0;i<3;i++)
{
printf("number is %d name is %s ",stu[i].number,stu[i].name);
}


return 0;
}




//改为输出到 磁盘文件a.txt
#include
#include
#include


struct Student
{
int number;
char *name;
};


int main()
{
FILE *fp;
fp=fopen("a.txt","w");

struct Student stu[3]={1001,"zhangsan",1002,"lisi",1003,"wangwu"};
for(int i=0;i<3;i++)
{
fprintf(fp,"%d %s ",stu[i].number,stu[i].name);
}


return 0;
}

//从键盘文件读入3个学生信息
//从磁盘文件a.txt读入3个学生信息
#include
#include
#include

struct Student
{
int number;
char *name;
};


int main()
{
struct Student stu[3];
char buffer[20]={'\0'};
FILE *fp=fopen("a.txt","r");

for(int i=0;i<3;i++)
{
fscanf(fp,"%d %s ",&stu[i].number,buffer); //fp为磁盘文件。如果改为stdin,就成了从键盘文件读入了
stu[i].name=(char *)malloc(strlen(buffer)+1);
strcpy(stu[i].name,buffer);


}


for(int j=0;j<3;j++)
{
printf("%d %s ",stu[j].number,stu[j].name);
}


return 0;
}




打开文件失败的判断和处理方法:
FILE *fp=fopen("a.txt","r");
if(fp==NULL)
{
printf("文件打开失败--无此文件");
return 1;
}


w----意义比较特殊
FILE *fp=fopen("a.txt","w");//w代表,不够有无a.txt,都会重新建立


利用两个fopen的返回值,来进行操作。






fp=fopen("a.txt","w+"); //a.txt仍然会重新建立。但也可以读了。


fp=fopen("a.txt","a"); //追加。 当无a.txt时,会新建 只能写文件,不能读


fp=fopen("a.txt","a+"); //也可以读






//如果a.txt文件存在,但内容为空,则会打印出 无效的数字
int main()
{
struct Student stu[3];
char buffer[20]={'\0'};
FILE *fp=fopen("a.txt","r");
int num;
fscanf(fp,"%d",&num);
printf("num is %d\n");


return 0;
}

//判断文件内容是否为 空 的语句
int main()
{
struct Student stu[3];
char buffer[20]={'\0'};
FILE *fp=fopen("a.txt","r");
fseek(fp,0,SEEK_END); //让游标走到文件末尾
int pos=ftell(fp); //返回当前游标的位置 利用特点:游标走到文件末尾,然后调用ftell,如果返回为0,就说明为空间。
printf("pos is %d\n",pos);


return 0;
}


333333
//feof(fp)的用法----判断是否到文件末尾了
代码:
#include
#include
#include


struct Student
{
int number;
char *name;
};
int main()
{
struct Student stu[30];
char buffer[20]={'\0'};
FILE *fp=fopen("a.txt","r");
int i=0;
//fseek(fp,0,SEEK_END);
//fseek(fp,0,SEEK_SET);




while(!feof(fp)) //如果文件没有到结尾,就执行 循环体
{


fscanf(fp,"%d %s ",&stu[i].number,buffer); //fp为磁盘文件。如果改为stdin,就成了从键盘文件读入了
stu[i].name=(char *)malloc(strlen(buffer)+1);
strcpy(stu[i].name,buffer);
i++;

}

for(int j=0;j<3;j++)
{
printf("%d %s ",stu[j].number,stu[j].name);
}

return 0;
}






文件读取函数
fprintf
fscanf


fgechchar
fgets


fread
fwite


rewind(fp)------游标回到起始位置 等价于 fseek(fp,0,SEEK_SET);

//例子:先将3个学生信息,写到文件;然后又从文件来读取,并打印输出
#include
#include
#include


struct Student
{
int number;
char *name;
};


int main()
{
FILE *fp;
fp=fopen("a.txt","w+"); //w+表示,能写入文件了,有增强了1下,所以也能读了
char buffer[30]="";
int i;

struct Student stu[3]={1001,"zhangsan",1002,"lisi",1003,"wangwu"};
for(i=0;i<3;i++)
{
fprintf(fp,"%d %s ",stu[i].number,stu[i].name);
}


rewind(fp);
for(i=0;i<3;i++)
{
memset(buffer,0,30); //memset的用:将buffer中的值,改为0,改30个----
fscanf(fp,"%d %s ",&stu[i].number,buffer); //fp为磁盘文件。如果改为stdin,就成了从键盘文件读入了
stu[i].name=(char *)malloc(strlen(buffer)+1);
strcpy(stu[i].name,buffer);

}

for(int j=0;j<3;j++)
{
printf("%d %s ",stu[j].number,stu[j].name);
}


return 0;
}

//fclose(fp)的用法----一定要用fclose,否则,输出缓存中的内容,可能还没有写到文件
int main()
{
FILE *fp;
fp=fopen("a.txt","w+");
char buffer[30]="";
int i;

struct Student stu[3]={1001,"zhangsan",1002,"lisi",1003,"wangwu"};
for(i=0;i<3;i++)
{
fprintf(fp,"%d %s ",stu[i].number,stu[i].name);
}
fclose(fp);



return 0;
}

容易犯错的地方:
1、1个文件只能用fopen打开1次,不要重复打开
2、要使用fclose关闭后,才能再次 打开
3、不需要的时候,文件要 及时 关闭