前情回顾
一开始定义结构体指针或者其他指针时,不一定只是定义,可以先置空再赋值或开辟空间,可以避免用strcpy函数时的某些不必要错误;而释放之前也可以先判断要释放的指针是否为空,再释放空间然后置空,避免操控野指针。
typedef struct student
{
char* name;
int age;
char* class;
}ss;
int main()
{
ss* p = NULL;
p = (ss*)malloc(sizeof(ss));
p->name = (char*)malloc(sizeof(char) * 21);
p->class = (char*)malloc(sizeof(char) * 21);
p->age = 20;
strcpy(p->name, "huanghaibin");
strcpy(p->class, "zidonghau");
printf("%d\n", p->age);
printf("%s\n%s\n", p->name,p->class);
if (p->class)
free(p->class);
p->class = NULL;
if (p->name)
free(p->name);
p->name = NULL;
if (p)
free(p);
p = NULL;
return 0;
}
一系列完整的代码就是这样,因为VS编译器和老编译器的不同,一般在头文件中加一行代码,让VS编译器兼容老编译器的功能
#define _CRT_SECURE_NO_WARNINGS
打开和关闭文件
运用文件函数,我们需要先了解文件指针。
文件指针:在C语言中用一个指针指向一个变量,是系统使用typedef定义出来的有关文件的一种结构体类型,结构中含有文件名、文件状态和当前位置等信息。
文件打开形式
FILE* fp=fopen("文件位置","打开形式");
文件打开成功为文件指针,打开失败为空(NULL),因为打开失败比较常见,所以要用一个判断句来判断是否成功,如果不成功返回-1,就是关闭。而文件打开形式有好几种
文件关闭形式
文件关闭和释放堆空间一样,不能够改变文件指针,不然不能关闭,而文件关闭成功返回值类型为int,成功返回0,不成功返回-1;
fclose(fp);
示范
FILE* fp=fopen("D:/a.txt","r");
if(!fp)
{
printf("文件打开失败");
return -1;
}
printf("打开成功");
fclose(fp);
文件打不开的原因一般有三个:打不开文件、文件权限(读 写 执行)、程序打开文件超出上限
文件读写
(1)整个文件读写
读文件用函数fgetc()
int fgetc(FLIE* stream)
功能:从stream指定文件中读取字符
返回值
成功:返回到读取指针
失败:-1
写文件用函数fputc()
int fputc(int ch,FILE* stream)
功能:将ch转换成unsigned char后写入stream对应的文件当中
返回值:
成功:成功写入文件
失败:返回-1
int main()
{
FILE* fp = fopen("D:/a.txt","w");
if (fp == NULL);
{
printf("文件打开失败");
return -1;
}
printf("文件打开成功");
char name;
while ((name = fgetc(fp) != EOF))
{
printf("%c", name);
}
char ch = "nashishabi";
fputc(ch, fp);
fclose(fp);
}
在这注意,文件指针不需要进行加减,文件读写的时候光标会自动到下一个。
(2)文件行读写
文件行读用函数fgets()
char* fgets(char* str,int size,FILE* stream)
功能:从strean指定的文件中读入字符,保存在str指定的内存空间中,知道出现换行符、读到文件结尾或是读了size-1个字符为止,最后会自动加上\0作为结束符结束
参数;
str:字符串
size:指定最大读取字符串长度(size-1)
stream:文件指针
返回值:
读到文件末尾或出错:NULL
文件行写函数fputs()
int fgets(const char* str,FILE* stream)
功能:将str指定的字符串写入stream指定的文件当中,字符串结束符\0不会写入文件
返回值:
成功:0
失败:-1
实例
int main()
{
FILE* fp = fopen("D:/a.txt","r");
FILE* fp1 = fopen("d:/b.txt", "w");
if (fp == NULL);
{
printf("文件打开失败");
return -1;
}
printf("文件打开成功");
char* name = (char*)malloc(sizeof(char) * 21);
memset(name, 0, 21);
fgets(name, 21, fp);
while ((name = fgetc(fp) != EOF))
{
printf("%c", name);
}
char ch[] = "nashishabi";
fputs(ch, fp1);
fclose(fp);
}
(3)检测文件是否到结尾的方式
#define EOF -1
文件到结尾,返回值为-1
函数feof()
int feof(FILE* stream)
返回值
非0值:已经到结尾
0;未到结尾
while(!feof(fp))
{
printf("文件未到结尾")
}
(4)文件格式化函数
写入文件的函数fprintf()
char p[]="hello world");
fprintf(fp,"%s",p);
fprintf(fp1,"%d%d",a,b);
读取文件函数fscanf()
char p[20];
memset(p,o,20);
fscanf(fp,"%s",p);
fscanf(fp1,"%d",&a);
(5)按照块读写文件
写文件fwrite()
size_t fwrite(const void* ptr,size_t size,size_t member,FILE*stream)
功能:以数据块的方式给文件写入内容
参数:
ptr:准备写入文件数据的地址
size:指定写入文件的数据块大小
member:写入文件的块数
stream:已经打开的文件
返回值
成功:实际成功写入文件数据的块数目
失败:0
读文件fread()
和fwrite()相似
int main()
{
FILE* fp = fopen("D:/b.txt", "rb");
FILE* fp1 = fopen("d:/c.txt", "wb");
char* p;
p = (char*)malloc(sizeof(char) * 21);
memset(p, 0, 21);
fread(p, sizeof(char), 21, fp);
fwrite(p, sizeof(char), 21, fp1);
return 0;
}
文章转载至http://blog.bools.cn/archives/978