重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这个其实很好理解
创新互联是一家专注于网站制作、成都网站设计与策划设计,荆门网站建设哪家好?创新互联做网站,专注于网站建设十年,网设计领域的专业建站公司;建站业务涵盖:荆门等地区。荆门做网站价格咨询:18982081108
只需要把%s,%c,%p放在一起看
首先%s是最常见的很好理解,就是告诉程序后面的变量是一个字符串,在C语言中也就是字符数组,类型是char*或者char[],换句话说,你告诉程序我会给你一个指针,你去读这个指针指向的值。
然后%c是告诉程序后面的变量是个字符,类型是char,差别已经很明显了,这时候你告诉程序我给你提供一个字符,你给我在%c处打印出来。然而你给的却是一个指针,那程序就直接把你给的指针指向的地址本身当成字符打印出来了。但是一个地址肯定不止一个字节,也就是说超过了char应该有的大小,这时候程序会直接忽略了超出大小的部分,只读第一个字节。
如果你同时使用%p,告诉程序,你会提供一个指针,直接把这个指针指向的地址给我打印出来。把输出的地址最后两位的16进制数查ascii表,换算成字符,你会发现,刚好就是前面%c打印出的字符。
/*
函数指针,关键是后面两个字“指针”,顾名思义,是一个指向函数的指针
原理:函数在创建好了后,函数的代码会在内存中占有个位置,这时我们创造一个指针来指向这个地址,这个指针就叫函数指针
函数指针不可以移动,想要移动指针的位置来指向函数的下一个指令的想法是错误的
函数指针的要求,
1,首先这个指针,要和函数的返回类型一样
2,指针的*和名字,要用小括号括起来//不括起来就是指针函数了,意思就变成,函数返回一个指针了
3,最右边的小括号里形参位置的类型,形参的个数,也要和函数定义时的形参一致,只要类型,不要形参名即可,
但是加上形参名也可以,没毛病,看上去也更清晰
*/
#include
void swapchar(char *a, char *b)
{
char t;
t = *a;
*a = *b;
*b = t;
}
void swapchar2(char * a2, char * b2)
{
printf("this is swapchar2");
}
int main(void)
{
char chf = 'a', chg = 'j';
void(*p)(char * a, char * b);//定义函数指针、形参名字a、b可有可无,但有的话看上去更清晰,只要函数定义的类型、参数类型、以及参数个数,与这个指针一致,那么这个指针p,就可以指向它
p = swapchar;//p指针接管swapchar函数,只要给函数名字,就可以给过去了
printf("chf=%c,chg=%c ", chf, chg);
p(chf, chg);
printf("chf=%c,chg=%c ", chf, chg);
p = swapchar2;//这里把swapchar2函数的地址,给了p,这时p从swapchar地址,转移到了swapchar2这里。
p(chf,chg);
return 0;
}
"r".为读而打开文本文件.(不存在则出错)
"rb".为读而打开二进制文件
while(!feof(fp))
文件到尾判断
最常用的文件使用方式及其含义如下:
"r".为读而打开文本文件.(不存在则出错)
"rb".为读而打开二进制文件.
"w".为写而打开文本文件.(若不存在则新建,反之,则从文件起始位置写,原内容将被覆盖)
"wb".为写而打开二进制文件.
"a".为在文件后面添加数据而打开文本文件.(若不存在,则新建;反之,在原文件后追加)
"ab".为在文件后面添加数据而打开一个二进制文件.
"r+".为读和写而打开文本文件.(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变)
"rb+".为读和写而打开二进制文件.只是在随后的读写时,可以由位置函数设置读和写的起始位置.
"w+".首先建立一个新文件,进行写操作,随后可以从头开始读.(若文件存在,原内容将全部消失)
"wb+".功能与"w+"同.只是在随后的读写时,可以由位置函数设置读和写的起始位置.
"a+".功能与"a"相同;只是在文件尾部添加新的数据后,可以从头开始读.
"ab+".功能与"a+"相同;只是在文件尾部添加新数据之后,可以由位置函数设置开始读的起始位置.
你的里面是有语法错误的
对你fwtite函数的使用没有正确使用
这个不是靠for循环实现多次读入的
具体的用法:
int fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
fwrite()函数从数组buffer(缓冲区)中, 写count个大小为size(大小)的对象到stream(流)指定的流. 返回值是已写的对象的数量.
然后你的里面还是应用了for循环
#include "stdio.h"
struct student_type
{
char name[10];
int num;
int age;
char addr[15];
}stud[2];
void save()
{
FILE *p;
int num;
if((p=fopen("FILE.txt","wb"))==NULL)
{
printf("open error\n");
return;
}
//int fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
//fwrite()函数从数组buffer(缓冲区)中, 写count个大小为size(大小)的对象到stream(流)指定的流. 返回值是已写的对象的数量.
/*
for(i=0;i2;i++)
if ( fwrite(stud[i],sizeof(struct student_type),1,p)!=1)
printf("data error\n");
*/
num = fwrite(stud, sizeof(struct student_type), 2, p);
fclose(p);
}
void main()
{
int i;
printf("请输入数据:\n");
for(i=0;i2;i++)
{
scanf("%s",stud[i].name);
scanf("%d",stud[i].num);
scanf("%d",stud[i].age);
scanf("%s",stud[i].addr);
}
save();
struct student_type stud1[2];
FILE *fp;
fp=fopen("FILE.txt","rb");
fread(stud1,sizeof(struct student_type),2,fp);
for (i = 0; i 2; i++)
{
printf("%s\t",stud1[i].name);
printf("%d\t",stud1[i].age);
printf("%d\t",stud1[i].num);
printf("%s\t",stud1[i].addr);
printf("\n");
}
fclose(fp);
}
至于fwrite好像是对数值型的写入有点不一样,就算是直接以“w”格式写入也是会出现不是直接看到数值